在上一章,模板模式中,我们在父类规定处理的流程,在子类中实现具体的处理。如果我们将该模式用于生成实例,便演变成了Factory模式,即工厂模式。

在Factory模式中,父类决定实例的生成方式,但并不决定所要生成的具体的类,具体处理全部交给子类进行。

设计实例则是模仿Spring框架进行的操作,模拟制作身份证。为了模拟Spring框架解耦,我们采用分包的方法,即生成实例的框架放在framework包中,而加工处理,具体实现的类放在具体实现的idcard包中。

  • framework包中的product类,用于表示产品这一类东西,定义了一个use抽象方法
package site.wangxin520.gof.factory.framework;

/**
* 仿spring框架,定义的一个工厂类生产的产品类
* @author wangXgnaw
*
*/
public abstract class Product { /**
* 定义一个顶层抽象方法,用于框架中工厂生产的产品,具体实现交给子类
*/
public abstract void use(); }
  • framework包中的Factory类
package site.wangxin520.gof.factory.framework;

/**
* 仿spring框架,建立一个Factory工厂,定义三个方法,具体实现交给子类完成。
* 这里采用的是模板方法
* @author wangXgnaw
*
*/
public abstract class Factory { /**
* 使用模板方法,具体创建product的实现交给子类
* @param owner 产品所有者姓名
* @return Product
*/
protected abstract Product createProduct(String owner);
/**
* 注册product
* @param product
*/
protected abstract void registerProduct(Product product); /**
* 创建product对象的模板方法
* @param owner 产品所有者姓名
* @return Product
*/
public final Product create(String owner){
Product p=createProduct(owner);
registerProduct(p);
return p;
}
}
  • idcard包中的IDCard类
package site.wangxin520.gof.factory.idcard;

import site.wangxin520.gof.factory.framework.Product;

/**
* 身份证的实体类
* @author wangXgnaw
*
*/
public class IDCard extends Product{ /**
* 隐藏IDCard的构造函数,拒绝外部包访问,外部包只能通过工厂模式进行访问
*/
IDCard() {
} //IDCard的属性
private String owner;
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
} @Override
public void use() {
System.out.println(owner+"使用了身份证");
} }
  • idcard包中的IDCardFactory类
package site.wangxin520.gof.factory.idcard;

import java.security.acl.Owner;
import java.util.ArrayList;
import java.util.List; import site.wangxin520.gof.factory.framework.Factory;
import site.wangxin520.gof.factory.framework.Product; /**
* 创建身份证的工厂
* @author wangXgnaw
*
*/
public class IDCardFactory extends Factory { //记录登记创建了的产品信息,貌似如果是单例模式的话,就可以直接从这里取值了,最好是map结构(猜测)
private List<Product> createdProduct=new ArrayList<Product>(); @Override
protected Product createProduct(String owner) {
IDCard idCard=new IDCard();
idCard.setOwner(owner);
System.out.println("创建了"+owner+"的身份证");
return idCard;
} @Override
protected void registerProduct(Product product) {
createdProduct.add(product);
} }
  • 具体测试类
package site.wangxin520.gof.factory.idcard;

import site.wangxin520.gof.factory.framework.Factory;
import site.wangxin520.gof.factory.framework.Product; /**
* 测试工厂类
* @author wangXgnaw
*
*/
public class FactoryTest { public static void main(String[] args) { Factory factory=new IDCardFactory(); Product p1 = factory.create("葵司");
Product p2 = factory.create("上原亚衣");
Product p3 = factory.create("古川伊织"); p1.use();
p2.use();
p3.use(); } }
  • 最终控制台输出结果为

设计模式之Factory工厂模式的更多相关文章

  1. 设计模式之Factory工厂模式的好处

    最最直观的好处就是吹牛逼,看着要比普通创建对象要屌 好看 一般情况下,我们创建对象使用的是new. Sample sample=new Sample(); 然而,实际情况会比这样复杂的多,比如说 Sa ...

  2. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...

  3. 设计模式之简单工厂模式(Simple Factory)

    原文地址:http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/06/2579100.html 今天呢,要学习的设计模式是“简单工厂模式”,这是一个 ...

  4. 桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式

    桥接模式及C++实现 桥接模式 先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式之一 ...

  5. java设计模式---三种工厂模式

    工厂模式提供创建对象的接口. 工厂模式分为三类:简单工厂模式(Simple Factory), 工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory).GOF在 ...

  6. Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)

    jquery提供的serialize方法能够实现. $("#searchForm").serialize();但是,观察输出的信息,发现serialize()方法做的是将表单中的数 ...

  7. iOS设计模式 - (3)简单工厂模式

    iOS设计模式 - (3)简单工厂模式           by Colin丶 转载请注明出处:              http://blog.csdn.net/hitwhylz/article/ ...

  8. 设计模式-Runoob:工厂模式

    ylbtech-设计模式-Runoob:工厂模式 1.返回顶部 1. 工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供 ...

  9. JavaScript设计模式一:工厂模式和构造器模式

    转自:http://segmentfault.com/a/1190000002525792 什么是模式 前阵子准备期末考试,挺累也挺忙的,实在闲不得空来更新文章,今天和大家说说javascript中的 ...

随机推荐

  1. jquery的商品首页

    js代码: $(function() { /*新闻滚动*/ var $this = $('.scrollNews'); var scrollTimer; $this.hover(function () ...

  2. QT4.8.5 源码编译记录

    今天想将以前的虚拟机的 QT4.8.5 集成到一个虚拟机里面,所以就重新编译了一次 QT4.8.5的源码 走了一点点小弯路,特此记录. 一.交叉编译器,不能直接从原来的虚拟机里面拷贝,必须使用官网的交 ...

  3. senfile函数实例的运行过程截图

    //要传输的文件内容如下所示: 启动服务器,等待客户端连接(在同一台主机上模拟的) 客户端远程登录,这里是在本地登录 这个要注意一点就是远程登陆的时候一定要带上端口号不然连接失败!!

  4. Android——Bundle savedInstanceState的作用

    写过Android程序的都知道Activity中有一个名称叫onCreate的方法.该方法是在Activity创建时被系统调用,是一个Activity生命周期的开始.可是有一点容易被忽视,就是onCr ...

  5. 1.Servlet

    1.什么是Servlet? * 服务器端Java程序,servlet需要交给服务器来运行. * 与javax.servlet.Servlet接口有关的java程序 2.如果使用servlet?[必须] ...

  6. 利用U盘给Intel NUC安装CentOS

    一,UltraISO(用来制作 U 盘启动) 需要新版9.6 下载地址为:http://www.onlinedown.net/soft/614.htm 软件注册码:王涛 7C81-1689-4046- ...

  7. linux使用ip能ping通,但使用域名却不能访问的解决方法

    使用命令:yum -y update进行更新测试,一般测试结果为couldn't resolve hostmirrors.aliyun.com 解决方式参考博客couldn't resolve hos ...

  8. 24SpringMvc中的重定向和转发-解释return "redirect:/cargo/contractproduct/tocreate.action";

    我在做JK项目时发现:我们在增加一个货物时.会先根据提交的Action()进入到一个新增页面 //跳转到新增的页面 @RequestMapping("/cargo/contractprodu ...

  9. 第二百七十三节,Tornado框架-文件上传

    Tornado框架-文件上传 第一.普通表单上传文件 self.request.files["fafafa"] 获取上传文件信息,参数["上传文件框的name名称&quo ...

  10. 第二百七十一节,Tornado框架-CSRF防止跨站post请求伪造

    Tornado框架-CSRF防止跨站post请求伪造 CSRF是什么 CSRF是用来在post请求时做请求验证的,防止跨站post请求伪造 当用户访问一个表单页面时,会自动在表单添加一个隐藏的inpu ...