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;}@Overridepublic 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>();@Overridepublic Product createProduct(String name) {return new IdCard(name);}@Overridepublic 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;}@Overridepublic 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;@Overrideprotected Product createProduct(String name) {return new Televison(name);}@Overrideprotected 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作注释,不然使用者必须了解上层代码,或者维护可能会修改使用者的具体用意。
转载于:https://www.cnblogs.com/dgwblog/p/9003648.html
Factory Method (工厂模式)相关推荐
- 工厂方法(Factory Method)模式
一.工厂方法(Factory Method)模式 工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟的子类中. 工厂方法模式是简单工厂 ...
- 设计模式的征途—3.工厂方法(Factory Method)模式
上一篇的简单工厂模式虽然简单,但是存在一个很严重的问题:当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背开闭原则.如何实现新增新产品而 ...
- 09Abstract Factory(抽象工厂)模式
技术交流QQ群:1027579432,欢迎你的加入! 1.Abstract Factory(抽象工厂)模式动机 在软件系统中,经常面临着一系列相互依赖的对象的创建工作.同时,由于需求的变化,往往存在更 ...
- 创建对象_工厂方法(Factory Method)模式 与 静态工厂方法
工厂方法模式: 定义:为创建对象定义一个接口,让子类决定实例化哪个类.工厂方法让一个类的实例化延迟至子类. 应用场景: 客户类不关心使用哪个具体类,只关心该接口所提供的功能: 创建过程比较复杂,例如需 ...
- Factory Method工厂方法模式
定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method使一个类的实例化延迟到其子类,属于创建型模式 在此模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类负责生产 ...
- 3.Factory Method 工厂方法模式(创建型模式)
1.定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使得一个类的实例化延迟到子类. 2.实现代码如下: /// <summary>/// 工厂方法 ...
- 设计模式学习总结1 - 创建型1 - Abstract Factory抽象工厂模式
AbstractFactory抽象工厂模式(创建型) 作用: 这种模式支持创建不同的对象,这些对象功能接近且一般都是在一起创建的.抽象工厂被具体化成不同的工厂来创建类似产品的不同产品.这种模式将类于使 ...
- 笔记:设计模式(3)-Abstract Factory抽象工厂模式
工厂模式的起源 1.变化点在"对象的创建",因此就封装"对象创建": 2.面向接口编程,依赖接口,而非依赖实现. 动机(Motivation) 在系统中,经 ...
- Factory Method工厂方法
"对象创建"模式 通过"对象创建"模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(以来具体类),从而支持对象创建的稳定.它是接口抽象之后的第一部工 ...
- Factory Pattern工厂模式
源地址 工厂模式是一种创建型模式,提供了一种创建对象的最佳方法模式. 应用实例: 您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现. Hiberna ...
最新文章
- 资产配置决策系统的MATLAB实现
- 保时捷高管透露曾与苹果洽谈CarPlay之外合作事宜
- YISplashScreen
- C# string byte[] 转换
- mysql linux内核_mysql 5.7.15 vs mysql 5.6.31性能测试以及不同linux内核性能比较
- English Corpora - 英语语料库
- 【信息系统项目管理师】信息系统项目管理师计算题汇总
- 基于STC12C5A60S2的SDHC卡的初始化和读写过程
- 无老师作文巨讲堂2015.8
- greenDao的使用与封装
- 数据价值深度挖掘,分析服务上线“探索”能力
- linux wifi设置和相关介绍
- idea 不识别java文件,类文件变成灰色,而且有橙色角标
- Python干掉了98%的办公软件
- P1455 搭配购买
- Google Guava Splitter
- 网易邮箱批量登泉器v1.0
- LilyPond 乐谱软件
- Linux CPU,内存查查清楚
- AD原理图以及PCB图元件(作为库)绘制流程
热门文章
- 罗宾斯管理学13版pdf_罗宾斯管理学(第13版)笔记和课后习题(含考研真题)详解...
- c++实验总结_高考化学选三简答题总结6——配位化合物、配位键、配位数
- 吴恩达团队最新成果:用深度学习预测死亡概率,改善临终关怀
- RFID和安防究竟有什么关系?
- Java线程那点事儿
- mysql5.7.18-winx64安装
- hadoop2.0初识1.2
- MFCWinInet学习
- jQuery Mobile 学习资料
- LeetCode 914. 卡牌分组