Factory Method (工厂模式)
什么是工厂设计模式
根据名字即可了解,工厂肯定是用来生产产品的,在我们的程序开发中,需要用到不同的类,对于熟悉SSH、SSM开发的可以知道,在初期学习的时候,总是有一个框架提供好的的factory供我们使用,利用它可以创建访问数据库的连接等操作。
定义:
利用template method设计模式创建我们想要的实例,就称之为factory method。
具体到面向对象
- 《framework》生成实例框架:可以理解为在我使用factoy method时这个是必须的,组成元素在这个包下
- 《product》: 具体的产品类,你需要生成什么就可以创建自己的产品。加工处理
UML 代码

这个例子就是实现创建一个身份证,然后使用它
framework包下
- Factory :创建实例的方法 这里要注意创建 注册都是维护的protected方法
- Product : 定义操作的方法product包下
- IdCard :具体的产品
- IdCardFactory :实现了具体的创建。Factory
package base.factory.framework;
/**
* @program: DesignPatterns
* @description: 创建实例的类
* @author: Mr.Dai
* @create: 2018-05-07 15:48
**/
public abstract class Factory {
public final Product create(String name){
Product product = createProduct(name);
registerProduct(product);
return product;
}
protected abstract Product createProduct(String name);
protected abstract void registerProduct(Product product);
}
- Product
package base.factory.framework;
/**
* @program: DesignPatterns
* @description: 定义具体方法的类
* @author: Mr.Dai
* @create: 2018-05-07 15:51
**/
public abstract class Product {
public abstract void use();
}
- IdCard
package base.factory.idcard;
import base.factory.framework.Product;
/**
* @program: DesignPatterns
* @description: 具体的身份类
* @author: Mr.Dai
* @create: 2018-05-07 15:57
**/
public class IdCard extends Product {
private String name;
IdCard(String name){
System.out.println("创建了"+name+"的身份证");
this.name=name;
}
@Override
public void use() {
System.out.println("使用了"+name+"的身份证");
}
public String getOwer(){
return this.name;
}
}
- IdCardFactory
package base.factory.idcard;
import base.factory.framework.Factory;
import base.factory.framework.Product;
import java.util.Vector;
/**
* @program: DesignPatterns
* @description: 生产身份证具体的类
* @author: Mr.Dai
* @create: 2018-05-07 16:00
**/
public class IdCardFactory extends Factory {
private Vector idcards=new Vector<String>();
@Override
public Product createProduct(String name) {
return new IdCard(name);
}
@Override
public void registerProduct(Product product) {
idcards.add(((IdCard)product).getOwer());
}
public Vector<String> getIdCards(){
return idcards;
}
}
- 结果

具体说明
- product:是生成实例具有的接口方法,具体处理由子类决定
- CreatedProduct:具体的产品 由idcard承担
- CreatedCreator:具体的创建者 由IdCardFactory承担
- IdCardFactory是具体的承担者,父类Factory将会解除与子类的耦合,实际上是子类具体的创建者来生成具体的实例。
- 实际运用中,我们没有必要去修改framework下的任何内容,假设我们这里要维护一台电视机,只需要创建具体的类即可。
实例产生的三种方式
- 指定为抽象方法
public abstract class Factory {
public final Product create(String name){
- 直接生成
public abstract class Factory {
public Product create(String name){
return new Product(name);//这样的话,product就不能为抽象类
Televison 电视类 并且实现 保存编号 以及所有者之间的对应表

- Televison
package base.factory.television;
import base.factory.framework.Product;
/**
* @program: DesignPatterns
* @description: 电视类
* @author: Mr.Dai
* @create: 2018-05-07 16:40
**/
public class Televison extends Product {
private String name;
Televison(String name){
this.name=name;
}
@Override
public void use() {
open();
runing();
close();
}
public void open(){
System.out.println("开电视"+name);
}
public void runing(){
System.out.println("看电视"+name);
}
public void close(){
System.out.println("关闭电视"+name);
}
public String getName(){
return this.name;
}
}
- TelevisionFactory
package base.factory.television;
import base.factory.framework.Factory;
import base.factory.framework.Product;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
/**
* @program: DesignPatterns
* @description: 创建televi
* @author: Mr.Dai
* @create: 2018-05-07 16:45
**/
public class TelevisionFactory extends Factory {
private TreeMap<Integer,String> teleS=new TreeMap<>();
private int i=0;
@Override
protected Product createProduct(String name) {
return new Televison(name);
}
@Override
protected void registerProduct(Product product) {
teleS.put(++i,((Televison)product).getName());
}
public TreeMap getTeles(){
return teleS;
}
}
相关设计模式
- template method :factory method就是模板设计模式的延伸。
- singleton :单例模式,这里我们的产品可以改为单例模式,我们实际运用中使用的到的类比如hibernate中的,都是单例的 如数据库连接等。
- Composite: composite模式用于product角色
- Iterator: 在Iterator模式中使用iterator方法生成Iterator实例会使用Factory Method。
还有一个问题是,使用Factory Method 设计模式,必须在具体的Product作注释,不然使用者必须了解上层代码,或者维护可能会修改使用者的具体用意。
Factory Method (工厂模式)的更多相关文章
- 小菜学习设计模式(三)—工厂方法(Factory Method)模式
前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...
- 工厂方法(Factory Method)模式
一.工厂方法(Factory Method)模式 工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟的子类中. 工厂方法模式是简单工厂 ...
- Factory Method 工厂方法模式
Factory method工厂方法模式是一种实现了“工厂”概念的面向对象设计模式.就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题.工厂方法模式的实质是“定义一个创建对象 ...
- 设计模式的征途—3.工厂方法(Factory Method)模式
上一篇的简单工厂模式虽然简单,但是存在一个很严重的问题:当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背开闭原则.如何实现新增新产品而 ...
- Java 工厂模式(一)— 工厂方法(Factory Method)模式
一.工厂方法(Factory Method)模式: 1.什么是工厂方法模式? 工厂方法模式是类的创建型模式,又叫做虚拟构造子模式或者多态工厂模式.它的意义是创建产品对象的工厂接口,将实际创建工作推迟到 ...
- 一天一个设计模式——Abstract Factory抽象工厂模式
一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂 ...
- 3.Factory Method 工厂方法模式(创建型模式)
1.定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使得一个类的实例化延迟到子类. 2.实现代码如下: /// <summary> /// 工厂方 ...
- 创建对象_工厂方法(Factory Method)模式 与 静态工厂方法
工厂方法模式: 定义:为创建对象定义一个接口,让子类决定实例化哪个类.工厂方法让一个类的实例化延迟至子类. 应用场景: 客户类不关心使用哪个具体类,只关心该接口所提供的功能: 创建过程比较 ...
- 面向对象设计模式纵横谈:Factory Method 工厂方法模式(笔记记录)
从耦合关系谈起 耦合关系直接决定着软件面对变化时的行为 -模块与模块之间的紧耦合使得软件面对变化时,相关模块都要随之更改 -模块与模块之间的松耦合使得软件面对变化时,一些模块更容易被替换或者更改,但其 ...
- Factory Method工厂方法模式
定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method使一个类的实例化延迟到其子类,属于创建型模式 在此模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类负责生产 ...
随机推荐
- JVM的内存区域模型
首先要明白一个概念,就是JVM的内存区域划分与java的内存区域模型是两个不同的概念,前者指的是在java中jvm会将一个程序划分为哪些块来存储对应的数据,后者是一个更宏观上的j概念,指的是java线 ...
- (八十七)AutoLayout的简介与实例
AutoLayout是继AutoResizing之后的一种自动布局方法,解决了AutoResizing无法处理控件间相互关系的问题. AutoLayout在storyboard中通过底部工具条设置,底 ...
- java设计模式---桥接模式
桥接模式的目的是把抽象和具体实现分离,其uml类图如下所示: public interface SendMessage { abstract void send(String message,Stri ...
- Visual Studio 2010多线程编程
随着处理数据量的逐渐增大,串行单核的程序,犹如残灯缺月,无法满足运用需求.大规模集群的出现,解决了这一技术难题.本文旨在探讨如何使用多CPU并行编程,关于CUDA的并行前面文章已有讲述.本文结构分为三 ...
- java容易混淆的15个知识点
java知识点不多,但是有一些经常会被我们忽略 1.java是强类型的语言,数组也是对象,一旦确定数组的类型,里面就只能存放一个类型的数据. 2.新建的对象都被存放到堆上,如果没有引用,会很快垃圾回收 ...
- listview的工作原理
/** * Unsorted views that can be used by the adapter as a convert view. */ private ArrayList<View ...
- 基于Retrofit2.0+RxJava+Dragger2实现不一样的Android网络构架搭建(转载)
转载请注明出处:http://blog.csdn.net/finddreams/article/details/50849385#0-qzone-1-61707-d020d2d2a4e8d1a374a ...
- CentOS安装并设置MariaDB
作者: 铁锚 日期: 2013年12月27日 部分参考: Centos 使用YUM安装MariaDB 说明: 首先必须能链接外网. 如果不能直接访问,那也可以设置代理,请参考: 在内网机器上设置yum ...
- Android 自定义View -- 简约的折线图
转载请注明出处:http://write.blog.csdn.net/postedit/50434634 接上篇 Android 圆形百分比(进度条) 自定义view 昨天分手了,不开心,来练练自定义 ...
- 使用GDAL将下载的Google卫星图像转为带坐标的tif
网上有很多下载Google地图的卫片的软件,一般下载下来的图像都是jpg格式的,另外附带一个坐标信息的描述文件.这样的数据不能直接拿来在遥感或者GIS软件中使用,因为图像里面没有投影和坐标信息,所以就 ...