1. 介绍

1.1 定义

工厂方法模式,又称工厂模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。

1.2 主要作用

将类的实例化(具体产品的创建)延迟到工厂类的子类(具体工厂)中完成,即由子类来决定应该实例化(创建)哪一个类。

1.3 解决的问题

工厂一旦需要生产新产品就需要修改工厂类的方法逻辑,违背了“开放 - 关闭原则

之所以可以解决简单工厂的问题,是因为工厂方法模式把具体产品的创建推迟到工厂类的子类(具体工厂)中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,这样工厂方法模式在添加新产品的时候就不修改工厂类逻辑而是添加新的工厂子类,符合开放封闭原则,克服了简单工厂模式中缺点

2. 模式原理

2.1 UML类图

2.2 模式组成

2.3 使用步骤

步骤1: 创建抽象工厂类,定义具体工厂的公共接口;
步骤2: 创建抽象产品类 ,定义具体产品的公共接口;
步骤3: 创建具体产品类(继承抽象产品类) & 定义生产的具体产品;
步骤4:创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法;
步骤5:外界通过调用具体工厂类的方法,从而创建不同具体产品类的实例

3. 实例讲解

3.1 实例概况

背景:小成有一间塑料加工厂(仅生产A类产品);随着客户需求的变化,客户需要生产B类产品;
冲突:改变原有塑料加工厂的配置和变化非常困难,假设下一次客户需要再发生变化,再次改变将增大非常大的成本;
解决方案:小成决定置办塑料分厂B来生产B类产品;

3.2 使用步骤

步骤1: 创建抽象工厂类,定义具体工厂的公共接口

abstract class Factory{public abstract Product Manufacture();
}

步骤2: 创建抽象产品类 ,定义具体产品的公共接口;

abstract class Product{public abstract void Show();
}

步骤3: 创建具体产品类(继承抽象产品类), 定义生产的具体产品;

//具体产品A类
class  ProductA extends  Product{@Overridepublic void Show() {System.out.println("生产出了产品A");}
}//具体产品B类
class  ProductB extends  Product{@Overridepublic void Show() {System.out.println("生产出了产品B");}
}

步骤4:创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法;

//工厂A类 - 生产A类产品
class  FactoryA extends Factory{@Overridepublic Product Manufacture() {return new ProductA();}
}//工厂B类 - 生产B类产品
class  FactoryB extends Factory{@Overridepublic Product Manufacture() {return new ProductB();}
}

步骤5:外界通过调用具体工厂类的方法,从而创建不同具体产品类的实例

//生产工作流程
public class FactoryPattern {public static void main(String[] args){//客户要产品AFactoryA mFactoryA = new FactoryA();mFactoryA.Manufacture().Show();//客户要产品BFactoryB mFactoryB = new FactoryB();mFactoryB.Manufacture().Show();}
}

实验题:

  1. 现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReader),如GIF图片读取器(GifReader)用于读取GIF格式的图片、JPG图片读取器(JpgReader)用于读取JPG格式的图片。图片读取器对象通过图片读取器工厂ImageReaderFactory来创建,ImageReaderFactory是一个抽象类,用于定义创建图片读取器的工厂方法,其子类GifReaderFactory和JpgReaderFactory用于创建具体的图片读取器对象。使用工厂方法模式实现该程序的设计。
//创建抽象产品ImageReader类 ,定义具体产品的公共接口
abstract class ImageReader{public abstract void Read();
}
//创建具体产品类(继承抽象产品类), 定义生产的具体产品;
//具体产品GifReader类
class  GifReader extends  ImageReader{public void Read() {System.out.println("读取GIF格式的图片");}
}
//创建具体产品类(继承抽象产品类), 定义生产的具体产品;
//具体产品JpgReader类
class  JpgReader extends  ImageReader{
public void Read() {System.out.println("读取JPG格式的图片");
}
}
//创建抽象工厂类,定义具体工厂的公共接口abstract class Factoryy{public abstract ImageReader Manufacture();
}
//创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法;
//工厂GifReaderFactory类 - 生产GifReaderFactory类产品
class  GifReaderFactory extends Factoryy{public ImageReader Manufacture() {return new GifReader();}
}
//工厂JpgReaderFactory类 - 生产JpgReader类产品
class  JpgReaderFactory extends Factoryy{
public ImageReader Manufacture() {return new JpgReader();
}
}
//外界通过调用具体工厂类的方法,从而创建不同具体产品类的实例//生产工作流程
public class FactoryPattern {public static void main(String[] args){//客户要产品AGifReaderFactory mFactoryA = new GifReaderFactory();mFactoryA.Manufacture().Read();//客户要产品BJpgReaderFactory mFactoryB = new JpgReaderFactory();mFactoryB.Manufacture().Read();}
}

4. 优点

  • 更符合开-闭原则

新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可
简单工厂模式需要修改工厂类的判断逻辑

  • 符合单一职责原则

每个具体工厂类只负责创建对应的产品
简单工厂中的工厂类存在复杂的switch逻辑判断

  • 不使用静态工厂方法,可以形成基于继承的等级结构。

简单工厂模式的工厂类使用静态工厂方法

总结:工厂方法模式可以说是简单工厂模式的进一步抽象和拓展,在保留了简单工厂的封装优点的同时,让扩展变得简单,让继承变得可行,增加了多态性的体现。

5. 缺点

  • 添加新产品时,除了增加新产品类外,还要提供与之对应的具体工厂类,系统类的个数将成对增加,在一定程度上增加了系统的复杂度;同时,有更多的类需要编译和运行,会给系统带来一些额外的开销;
  • 虽然保证了工厂方法内的对修改关闭,但对于使用工厂方法的类,如果要更换另外一种产品,仍然需要修改实例化的具体工厂类;
  • 一个具体工厂只能创建一种具体产品

6. 应用场景

(1)当一个类不知道它所需要的对象的类时,在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可

(2)当一个类希望通过其子类来指定创建对象时在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。

(3)将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中。

创建型设计模式----工厂方法模式相关推荐

  1. python创建方法draw_【python设计模式-创建型】工厂方法模式

    工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻 ...

  2. java 工厂方法_java设计模式-工厂方法模式

    1.工厂方法(FactoryMethod)模式的定义 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的"创建与使用相分离" ...

  3. 4. 星际争霸之php设计模式--工厂方法模式

    题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...

  4. 设计模式 | 工厂方法模式及典型应用

    工厂方法模式 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个类实例化.工厂方法模式让一个类的实例化延迟到其子类. 工厂方法模式又简称为工厂 ...

  5. 工厂方法模式_1天1个设计模式——工厂方法模式

    意图 工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型. 问题 假设你正在开发一款物流管理应用.1.0版本只能支持处理卡车运输,因此大部分的代码都位 ...

  6. JAVA设计模式 - 工厂方法模式

    工厂方法模式(Factory Pattern) 是一种创建型设计模式 , 它是Java中最常用的设计模式之一 . 1 . 工厂方法模式的定义 定义一个创建对象的接口 , 让子类决定实例化哪一个类 . ...

  7. python工厂模式 django_python设计模式-工厂方法模式

    题目:假设你有一个 pizza 店,功能包括下订单.做 pizza,你的代码会如何写呢? def order_pizza(): pizza = Pizza() pizza.prepare() pizz ...

  8. [设计模式] ------ 工厂方法模式

    工厂方法模式 手机厂造手机,肥皂厂造肥皂,药品厂造药品. 假设有一大类对象A1,A2,A3,A4-他们都有一个共同的父类A A1可以想成是手机,A2可以想成肥皂- (下面例子的A1Factory就是手 ...

  9. Java设计模式—工厂方法模式抽象工厂模式

    工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式.       工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在 ...

最新文章

  1. 为什么多 TCP 连接比单 TCP 连接传输快
  2. MongoDB 启动 Failed to connect to 127.0.0.1:27017, reason: 由于目标计算机积极拒绝,无法连接。...
  3. php分页样式,thinkphp分页样式修改
  4. app h5 上传按钮多选_稿定小课堂之教你如何制作H5
  5. 简单shell 学习
  6. 【详解】()调试方法从线索(错误征兆)出发,通过分析这些线索之间的关系而找出故障,是从个别推断一般的方法。
  7. GCN图卷积网络入门详解
  8. oem监控mysql_OEM12c 安装配置MySQL Plug-in用来监控MySQL
  9. SN战队创造历史,苏宁集团发内部嘉奖令
  10. 又一辆特斯拉电动汽车撞上警车,都是因为这个功能
  11. 谷歌开源Embedding可视化工具
  12. iOS开发手记-仿QQ音乐播放器动态歌词的实现
  13. FreeTextBox备忘
  14. 通信系统中各网络设备时间同步要求
  15. 第一次:《三国志2017》游戏纯玩体验及总结
  16. 三菱凌云3故障代码_三菱故障代码一览表
  17. 年末展望:Oracle 对 JDK收费和.NET Core 给我们的机遇
  18. 计算机无法识别点读笔,点读笔插电脑上不识别
  19. 保留两位小数的四舍五入
  20. 汇编语言实验4:分支程序题目设计

热门文章

  1. 在华为的竞争下,高通的脚步已乱
  2. DedeCMS实战-----2、制作频道封面页模板
  3. 计算机主机内部的结构,计算机主机内部解析
  4. docker desktop tutorial 示例报错的处理
  5. 最全自动驾驶数据集分享系列一|目标检测数据集(2/3)
  6. 如何查询域名是否被微信拦截 被已经被微信屏蔽了的的域名网址改如何做防封防屏蔽
  7. Facebook、谷歌、苹果最新财报连连看,“金主”非苹果莫属
  8. 从Autoencoder到VAE及其变体
  9. Java拾遗:004 - JDK、Hadoop、Hessian序列化
  10. centerOS7扩容