什么是工厂设计模式

根据名字即可了解,工厂肯定是用来生产产品的,在我们的程序开发中,需要用到不同的类,对于熟悉SSH、SSM开发的可以知道,在初期学习的时候,总是有一个框架提供好的的factory供我们使用,利用它可以创建访问数据库的连接等操作。

定义:

利用template method设计模式创建我们想要的实例,就称之为factory method。

具体到面向对象

  • 《framework》生成实例框架:可以理解为在我使用factoy method时这个是必须的,组成元素在这个包下
  • 《product》: 具体的产品类,你需要生成什么就可以创建自己的产品。加工处理

UML 代码

这个例子就是实现创建一个身份证,然后使用它

  • framework包下

    - Factory :创建实例的方法 这里要注意创建 注册都是维护的protected方法

    - Product : 定义操作的方法

  • product包下

    - IdCard :具体的产品

    - IdCardFactory :实现了具体的创建。

  • Factory

  1. package base.factory.framework;
  2. /**
  3. * @program: DesignPatterns
  4. * @description: 创建实例的类
  5. * @author: Mr.Dai
  6. * @create: 2018-05-07 15:48
  7. **/
  8. public abstract class Factory {
  9. public final Product create(String name){
  10. Product product = createProduct(name);
  11. registerProduct(product);
  12. return product;
  13. }
  14. protected abstract Product createProduct(String name);
  15. protected abstract void registerProduct(Product product);
  16. }
  • Product

  1. package base.factory.framework;
  2. /**
  3. * @program: DesignPatterns
  4. * @description: 定义具体方法的类
  5. * @author: Mr.Dai
  6. * @create: 2018-05-07 15:51
  7. **/
  8. public abstract class Product {
  9. public abstract void use();
  10. }
  • IdCard

  1. package base.factory.idcard;
  2. import base.factory.framework.Product;
  3. /**
  4. * @program: DesignPatterns
  5. * @description: 具体的身份类
  6. * @author: Mr.Dai
  7. * @create: 2018-05-07 15:57
  8. **/
  9. public class IdCard extends Product {
  10. private String name;
  11. IdCard(String name){
  12. System.out.println("创建了"+name+"的身份证");
  13. this.name=name;
  14. }
  15. @Override
  16. public void use() {
  17. System.out.println("使用了"+name+"的身份证");
  18. }
  19. public String getOwer(){
  20. return this.name;
  21. }
  22. }
  • IdCardFactory

  1. package base.factory.idcard;
  2. import base.factory.framework.Factory;
  3. import base.factory.framework.Product;
  4. import java.util.Vector;
  5. /**
  6. * @program: DesignPatterns
  7. * @description: 生产身份证具体的类
  8. * @author: Mr.Dai
  9. * @create: 2018-05-07 16:00
  10. **/
  11. public class IdCardFactory extends Factory {
  12. private Vector idcards=new Vector<String>();
  13. @Override
  14. public Product createProduct(String name) {
  15. return new IdCard(name);
  16. }
  17. @Override
  18. public void registerProduct(Product product) {
  19. idcards.add(((IdCard)product).getOwer());
  20. }
  21. public Vector<String> getIdCards(){
  22. return idcards;
  23. }
  24. }
  • 结果

具体说明

  • product:是生成实例具有的接口方法,具体处理由子类决定
  • CreatedProduct:具体的产品 由idcard承担
  • CreatedCreator:具体的创建者 由IdCardFactory承担
  • IdCardFactory是具体的承担者,父类Factory将会解除与子类的耦合,实际上是子类具体的创建者来生成具体的实例。
  • 实际运用中,我们没有必要去修改framework下的任何内容,假设我们这里要维护一台电视机,只需要创建具体的类即可。

实例产生的三种方式

  • 指定为抽象方法

  1. public abstract class Factory {
  2. public final Product create(String name){
  • 直接生成
  1. public abstract class Factory {
  2. public Product create(String name){
  3. return new Product(name);//这样的话,product就不能为抽象类

Televison 电视类 并且实现 保存编号 以及所有者之间的对应表

  • Televison
  1. package base.factory.television;
  2. import base.factory.framework.Product;
  3. /**
  4. * @program: DesignPatterns
  5. * @description: 电视类
  6. * @author: Mr.Dai
  7. * @create: 2018-05-07 16:40
  8. **/
  9. public class Televison extends Product {
  10. private String name;
  11. Televison(String name){
  12. this.name=name;
  13. }
  14. @Override
  15. public void use() {
  16. open();
  17. runing();
  18. close();
  19. }
  20. public void open(){
  21. System.out.println("开电视"+name);
  22. }
  23. public void runing(){
  24. System.out.println("看电视"+name);
  25. }
  26. public void close(){
  27. System.out.println("关闭电视"+name);
  28. }
  29. public String getName(){
  30. return this.name;
  31. }
  32. }
  • TelevisionFactory
  1. package base.factory.television;
  2. import base.factory.framework.Factory;
  3. import base.factory.framework.Product;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6. import java.util.TreeMap;
  7. /**
  8. * @program: DesignPatterns
  9. * @description: 创建televi
  10. * @author: Mr.Dai
  11. * @create: 2018-05-07 16:45
  12. **/
  13. public class TelevisionFactory extends Factory {
  14. private TreeMap<Integer,String> teleS=new TreeMap<>();
  15. private int i=0;
  16. @Override
  17. protected Product createProduct(String name) {
  18. return new Televison(name);
  19. }
  20. @Override
  21. protected void registerProduct(Product product) {
  22. teleS.put(++i,((Televison)product).getName());
  23. }
  24. public TreeMap getTeles(){
  25. return teleS;
  26. }
  27. }

相关设计模式

  • template method :factory method就是模板设计模式的延伸。
  • singleton :单例模式,这里我们的产品可以改为单例模式,我们实际运用中使用的到的类比如hibernate中的,都是单例的 如数据库连接等。
  • Composite: composite模式用于product角色
  • Iterator: 在Iterator模式中使用iterator方法生成Iterator实例会使用Factory Method。

还有一个问题是,使用Factory Method 设计模式,必须在具体的Product作注释,不然使用者必须了解上层代码,或者维护可能会修改使用者的具体用意。

Factory Method (工厂模式)的更多相关文章

  1. 小菜学习设计模式(三)—工厂方法(Factory Method)模式

    前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...

  2. 工厂方法(Factory Method)模式

    一.工厂方法(Factory Method)模式 工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟的子类中. 工厂方法模式是简单工厂 ...

  3. Factory Method 工厂方法模式

    Factory method工厂方法模式是一种实现了“工厂”概念的面向对象设计模式.就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题.工厂方法模式的实质是“定义一个创建对象 ...

  4. 设计模式的征途—3.工厂方法(Factory Method)模式

    上一篇的简单工厂模式虽然简单,但是存在一个很严重的问题:当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背开闭原则.如何实现新增新产品而 ...

  5. Java 工厂模式(一)— 工厂方法(Factory Method)模式

    一.工厂方法(Factory Method)模式: 1.什么是工厂方法模式? 工厂方法模式是类的创建型模式,又叫做虚拟构造子模式或者多态工厂模式.它的意义是创建产品对象的工厂接口,将实际创建工作推迟到 ...

  6. 一天一个设计模式——Abstract Factory抽象工厂模式

    一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂 ...

  7. 3.Factory Method 工厂方法模式(创建型模式)

    1.定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使得一个类的实例化延迟到子类. 2.实现代码如下: /// <summary> /// 工厂方 ...

  8. 创建对象_工厂方法(Factory Method)模式 与 静态工厂方法

      工厂方法模式:   定义:为创建对象定义一个接口,让子类决定实例化哪个类.工厂方法让一个类的实例化延迟至子类.   应用场景: 客户类不关心使用哪个具体类,只关心该接口所提供的功能: 创建过程比较 ...

  9. 面向对象设计模式纵横谈:Factory Method 工厂方法模式(笔记记录)

    从耦合关系谈起 耦合关系直接决定着软件面对变化时的行为 -模块与模块之间的紧耦合使得软件面对变化时,相关模块都要随之更改 -模块与模块之间的松耦合使得软件面对变化时,一些模块更容易被替换或者更改,但其 ...

  10. Factory Method工厂方法模式

    定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method使一个类的实例化延迟到其子类,属于创建型模式 在此模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类负责生产 ...

随机推荐

  1. OC可点击的两种轮播图效果

    基本上,每一个APP都有一个轮播图的效果展示,一般都是用来展示图片的一些信息,然后可以点击查看或购买,所以在此我将这种轮播图进行了一个类的封装,效果包含两种形式:第一种,来回轮转样式,第二种,一个方向 ...

  2. Spring+Hibernate4 Junit 报错No Session found for current thread

    论坛上有另外一篇更全面的帖子,jinnianshilongnian写的:http://www.iteye.com/topic/1120924 本文的环境是:  spring-framework-3.1 ...

  3. java开源项目之IQQ学习记录之项目环境搭建与启动

    本文链接地址:http://blog.csdn.net/sushengmiyan/article/details/18779727 作者:sushengmiyan 现在就码字说说今天晚上搞定的一个项目 ...

  4. BIP Requests Are Failing With Error "OPP Error Oracle.apps.xdo.XDOException: Error Creating Lock Fil

    In this Document   Symptoms   Cause   Solution   References Applies to: BI Publisher (formerly XML P ...

  5. Caffe框架,图像数据转换成LMDB数据格式

    小码农最近在研究深度学习,对所学知识做点记录,以供以后翻阅.在Caffe框架中,数据的格式都是LMDB的,如何将图像数据转换成这个格式呢? 首先,将图像数据和标签生成txt文档,执行一下代码: fin ...

  6. curl命令备注

    curl是利用URL语法在命令行方式下工作的开源文件传输工具.它被广泛应用在Unix.多种Linux发行版中,并且有DOS和Win32.Win64下的移植版本.1.get请求:curl "h ...

  7. Linux IPC实践(10) --Posix共享内存

    1. 创建/获取一个共享内存 #include <sys/mman.h> #include <sys/stat.h> /* For mode constants */ #inc ...

  8. Get Form type using javascript in CRM 2011

    Get from type var type = Xrm.Page.ui.getFormType(); getFromType() function returns integer value for ...

  9. H5学习之旅-H5的布局(10)

    两种实现方式:div和table div实现布局的方式 代码实例 <!DOCTYPE html> <html lang="en"> <head> ...

  10. 取消选中单选框radio的三种方式

    作者: 铁锚 日期: 2013年12月21日 本文提供了三种取消选中radio的方式,代码示例如下: 本文依赖于jQuery,其中第一种,第二种方式是使用jQuery实现的,第三种方式是基于JS和DO ...