相关链接:

【设计模式】专栏:【设计模式】专栏

相关例子代码可下载: Java常用设计模式例子

简介

目前工厂模式大致分为3种,分别是:

  1. 简单工厂模式

  2. 工厂方法模式

  3. 抽象工厂模式

简单工厂模式

简单工厂模式(Simple Factory Pattern)是属于创建型模式,又叫做静态工厂方法(Static Factory Method Pattern)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

作用:

将“类实例化”的操作和“使用对象”的操作分开,让使用者不用知道具体参数就可以实例化所需要的“产品”类,从而避免了在客户端代码中显式指定,实现了解耦。

主要角色

具体工厂(Creator)角色

简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需要的产品对象。

抽象产品(Product)角色

简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

具体产品(Concrete Product)角色

简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

举个栗子:

假设有一台饮料机(工厂),可以调出各种口味的饮料(抽象产品),有三个按钮(参数)对应这三种饮料(具体产品)。这时候你可以根据点击按钮来选择你喜欢的饮料。

抽象产品:Product.java

/*** 简单工厂模式——抽象产品* 说明:* 描述产品的公共接口**/
public abstract class Product {/*** 产品介绍*/public abstract void introduce();
}

具体产品: CocoProduct.java  、 MilkProduct.java 、 CofficeProduct.java

/*** 简单工厂模式——具体产品 A** (可以看成是一种饮料:可乐)**/
public class CocoProduct extends Product{@Overridepublic void introduce() {System.out.println("可乐");}
}/*** 简单工厂模式——具体产品 B**(可以看成是一种饮料:奶茶)**/
public class MilkProduct extends Product{@Overridepublic void introduce() {System.out.println("奶茶");}
}/*** 简单工厂模式——具体产品 C** (可以看成是一种饮料:咖啡)**/
public class CofficeProduct extends Product{@Overridepublic void introduce() {System.out.println("咖啡");}
}

具体工厂:SimpleFactory.java

/*** 简单工厂模式——具体工厂* * 负责实现创建所有实例的内部逻辑,并提供一个外接调用的方法,创建所需的产品对象**/
public class SimpleFactory {/*** 提供给外接调用的方法* (可以看成是对外提供的三个小按钮)** @param type 产品类型* @return FactoryPattern.SimpleFactoryPattern.Product*/public static Product getProduct(String type) {switch (type) {case "coco":return new CocoProduct();case "milk":return new MilkProduct();case "coffice":return new CofficeProduct();default:return null;}}}

测试:SimpleFactoryDemo.java

/*** 简单工厂模式**/
public class SimpleFactoryDemo {public static void main(String[] args) {// 创建具体的工厂SimpleFactory factory = new SimpleFactory();// 根据传入的参数生产不同的产品实例// (按下不同的按钮,获取饮料)Product coco = SimpleFactory.getProduct("coco");coco.introduce();Product milk = SimpleFactory.getProduct("milk");milk.introduce();Product coffice = SimpleFactory.getProduct("coffice");coffice.introduce();}}

根据栗子可以描述为:

  • 一个抽象产品类,可以派生出多个具体产品类

  • 一个具体工厂类,通过往此工厂的static方法中传入不同参数,产出不同的具体产品类实例

优缺点

优点

  • 将创建、使用工作分开,不必关心类对象如何创建,实现了解耦

  • 把初始化实例时的工作放到工厂里进行,使代码更容易维护。更符合面向对象的原则&面向接口编程,而不是面向实现编程

缺点

  • 工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响

  • 违背“开放-关闭”原则,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂

  • 简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成

工厂方法模式

工厂方法模式,又称工厂模式(Factory Pattern)、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。(常用!)

作用:

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

主要角色

抽象工厂(Abstract Factory)角色

描述具体工厂的公共接口。

具体工厂(Concrete Factory)角色

描述具体工厂,创建产品的实例,供外界调用,主要实现了抽象工厂中的抽象方法,完成具体产品的创建。

抽象产品(Product)角色

负责描述产品的公共接口,定义了产品的规范,描述了产品的主要特性和功能。

具体产品(Concrete Product)角色

描述生产的具体产品,实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

举个栗子:

假设有各类的饮料机(抽象工厂),可以调出各种的饮料(抽象产品)。但是一类饮料机(具体工厂),只能生产一种饮料(具体产品)。如果你需要喝可乐,就需要买可乐饮料机。

抽象产品:Product.java

/*** 工厂方法模式——抽象产品**/
public abstract class Product {/*** 产品介绍*/public abstract void introduce();
}

具体产品:ProductA.java 、ProductB.java

/*** 工厂方法模式——具体产品A**/
public class ProductA extends Product{@Overridepublic void introduce() {System.out.println("饮料A");}
}/*** 工厂方法模式——具体产品B**/
public class ProductB extends Product{@Overridepublic void introduce() {System.out.println("饮料B");}
}

抽象工厂:Factory.java

/*** 工厂方法模式——抽象工厂**/
public abstract class Factory {/*** 生产产品** @return FactoryPattern.FactoryPattern.Product*/public abstract Product getProduct();
}

具体工厂:FactoryA.java 、FactoryB.java

/*** 工厂方法模式——具体工厂A** (负责具体的产品A生产)**/
public class FactoryA extends Factory{@Overridepublic Product getProduct() {return new ProductA();}
}/*** 工厂方法模式——具体工厂B** (负责具体的产品B生产)**/
public class FactoryB extends Factory{@Overridepublic Product getProduct() {return new ProductB();}
}

测试:FactoryDemo.java

/*** 工厂方法模式**/
public class FactoryDemo {public static void main(String[] args) {// 创建具体的工厂FactoryA factoryA = new FactoryA();// 生产相对应的产品factoryA.getProduct().introduce();FactoryB factoryB = new FactoryB();factoryB.getProduct().introduce();}}

根据栗子可以描述为

  • 一个抽象产品类,可以派生出多个具体产品类

  • 一个抽象工厂类,可以派生出多个具体工厂类

  • 每个具体工厂类只能创建一个具体产品类的实例

优缺点

优点

  • 符合“开-闭原则”,扩展性高:新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可

  • 符合单一职责原则:每个具体工厂类只负责创建对应的产品

缺点

  • 增加了系统的复杂度:类的个数将成对增加

  • 增加了系统的抽象性和理解难度

  • 一个具体工厂只能创建一种具体产品

抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

抽象工厂模式工厂方法模式 最大的区别:

  • 抽象工厂中,每个工厂可以创建多种类的产品
  • 工厂方法中,每个工厂只能创建一类产品

作用

允许使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么,这样就可以从具体产品中被解耦。

主要角色

抽象工厂(Abstract Factory)角色

描述具体工厂的公共接口

具体工厂(Concrete Factory)角色

描述具体工厂,创建产品的实例,供外界调用

抽象产品族(Abstract Product)角色

描述抽象产品的公共接口

抽象产品(Product)角色

描述具体产品的公共接口

具体产品(Concrete Product)角色

描述生产的具体产品

举个栗子:

假设有各类的自动售卖机(抽象工厂),可以出售各类食品(抽象产品族)。

有饮料、零食(抽象产品),比如常见的零售售卖机(具体工厂),出售矿泉水与面包(具体产品)。

抽象产品族:Product.java

/*** 抽象工厂模式——抽象产品族(食品)**/
public abstract class Product {/*** 产品介绍*/public abstract void introduce();
}

抽象产品:ProductA.java、ProductB.java

/*** 抽象工厂模式——抽象产品(饮料)**/
public abstract class ProductA extends Product{
}/*** 抽象工厂模式——抽象产品(零食)**/
public abstract class ProductB extends Product{
}

具体产品:ProductAa.java、ProductBb.java

/*** 抽象工厂模式——具体产品**/
public class ProductAa extends ProductA{@Overridepublic void introduce() {System.out.println("矿泉水");}
}/*** 抽象工厂模式——具体产品**/
public class ProductBb extends ProductB{@Overridepublic void introduce() {System.out.println("面包");}
}

抽象工厂:AbstractFactory.java

/*** 抽象工厂模式——抽象工厂**/
public abstract class AbstractFactory {/*** 生产饮料*/public abstract Product getProductA();/*** 生产零食*/public abstract Product getProductB();
}

具体工厂:AbstractFactoryA.java

/*** 抽象工厂模式——具体工厂** 负责具体的A类产品生产**/
public class AbstractFactoryA extends AbstractFactory{@Overridepublic Product getProductA() {// 生产矿泉水return new ProductAa();}@Overridepublic Product getProductB() {// 生产面包return new ProductBb();}
}

测试:AbstractFactoryDemo.java

/*** 抽象工厂模式**/
public class AbstractFactoryDemo {public static void main(String[] args) {// 创建零食售卖机(具体工厂)AbstractFactoryA abstractFactoryA = new AbstractFactoryA();// 获取矿泉水与面包(具体产品)abstractFactoryA.getProductA().introduce();abstractFactoryA.getProductB().introduce();}}

根据实例可以描述为:

  • 多个抽象产品类,每个抽象产品可以派生出多个具体产品类

  • 一个抽象工厂类,可以派生出多个具体工厂类

  • 每个具体工厂类可以创建多个 具体产品类的实例

优缺点

优点

  • 降低耦合

  • 符合“开-闭原则”

  • 符合单一职责原则

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

  • 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点

  • 难以扩展新种类产品,要增加一个系列的某一产品,既要在抽象产品里加代码,又要在具体的里面加代码。

结束语

1、更多设计模式内容请看【设计模式】专栏

2、相关例子代码可下载: Java常用设计模式例子

PS:  【 Java常用设计模式例子 】 内已包含 【设计模式】专栏 里涉及的代码,如果之前已下载过的同学,就不需要重复下载啦~

以上内容如有不正确或需要补充的地方,还请多多请教,会及时更新改正~

欢迎评论~ 感谢点赞~

设计模式——工厂模式(包含:简单工厂模式、工厂方法模式、抽象工厂模式)相关推荐

  1. 设计模式学习笔记(三)工厂模式中的简单工厂、工厂方法和抽象工厂模式之间的区别

    设计模式中的工厂模式(Factory Design pattern)是一个比较常用的创建型设计模式,其中可以细分为三种:简单工厂(Simple Factory).工厂方法(Factory Method ...

  2. 2.5万字详解23种设计模式—创建型模式(简单工厂、工厂方法、抽象工厂、单例-多线程安全详解、建造者、原型)的详细解读、UML类图

    本文简述了各大设计模式,并通过UML和代码详细说明.本文大约共 2.5W 字,建议收藏.下方是本文的目录: 一.设计模式的认识 二.设计模式的分类 根据其目的 根据范围 三.设计模式的优点 四.设计模 ...

  3. 设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)

    工厂模式 Factory Pattern(简单工厂.工厂方法.抽象工厂) 工厂模式-创建型模式-提供了创建对象的最佳方式. 在工厂模式中,创建对象时不会对客户端暴露创建逻辑,并且是通过一个共同的接口来 ...

  4. Java工厂模式(简单工厂、工厂方法、抽象工厂)详解

    工厂模式是一种非常常用的创建型设计模式,其提供了创建对象的最佳方式.在创建对象时,不会对客户端暴露对象的创建逻辑,而是通过使用共同的接口来创建对象. 1.工厂模式的理解 1.1.工厂模式的分类 工厂模 ...

  5. 设计模式:工厂方法与抽象工厂模式

    说明:这篇blog写的很好,有助于理解工厂方法与抽象工厂模式的联系与区别. 原文链接:http://blog.csdn.net/yzxz/article/details/4601152 抽象工厂模式与 ...

  6. 设计模式-抽象工厂模式的应用场景及Java中对抽象工厂的应用

    1. 什么是抽象工厂模式 抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定他们的类 抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用 ...

  7. 工厂模式(简单工厂,工厂方法,抽象工厂)

    工厂顾名思义就是创建产品,工厂分为三种:简单工厂,工厂方法,抽象工厂.该模式用于封装和管理对象的创建,是一种创建型模式. 1)简单工厂 该模式通过向工厂传递类型来指定要创建的对象 提供一个方法,根据类 ...

  8. 设计模式学习笔记(三)简单工厂、工厂方法和抽象工厂之间的区别

    设计模式中的工厂模式(Factory Design pattern)是一个比较常用的创建型设计模式,其中可以细分为三种:简单工厂(Simple Factory).工厂方法(Factory Method ...

  9. 设计模式——简单工厂、工厂方法和抽象工厂的区别与联系

    前言 创建型模式中,常用的有工厂方法模式和抽象工厂模式,平时实践还包括简单工厂模式,虽然简单工厂模式不在23种设计模式中. 为了区分以上几种设计模式的差别,通过以下几个例子介绍这几种模式的使用场景以及 ...

  10. 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别

    简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...

最新文章

  1. php 跨域读php_php跨域的几种方式
  2. GDCM:DICOM文件的覆盖测试程序
  3. Goalng软件包推荐
  4. HDU 1233 还是畅通工程(最小生成树)
  5. Java 产生随机数:Java 中产生随机数的方法及应用汇总
  6. 格式化js/html代码的好工具
  7. ThreadPoolExecutor执行任务,异常日志缺失问题
  8. java线程学习笔记
  9. 模糊数学模型(一): 隶属函数、模糊集合的表示方法、模糊关系、模糊矩阵
  10. 新手如何学习PLC编程?
  11. 台式机电源选购资料调研+为什么50%的时候负载功率最大+80PLUS的解释
  12. openGauss开机自启动
  13. 彻底删除手机系统软件
  14. 在Linux操作系统中,eclipse建立快捷方式
  15. 红茶保质期一年半,我都放了五年了,打开还有茶味,能喝吗?
  16. 下一代防火墙(NGFW)已死!
  17. Java多线程Zip压缩
  18. 机械硕士申计算机博士,UGA机械工程博士排名,史上最有用套路
  19. 计算机办公软件试题答案,2017年office办公软件考试题目及答案
  20. [手机分享]黑莓手机7系列分享之——7100G

热门文章

  1. STM8S103之串口中断接收
  2. 全网最详细的ensp模拟器安装教程
  3. arcgis伪节点检查_ARCGIS 拓扑检查步骤与修正拓扑错误技巧
  4. 最新高级JAVA架构师之路(价值3万元+年薪百万计划)
  5. 一个例子搞懂单纯形法大M法和两阶段法
  6. cad批量打印快捷键_CAD高效批量打印成PDF
  7. java 批量打印pdf文件_java 打印tiff及批量打印图片技术文章.doc
  8. 抗量子加密:为什么你迫切需要它
  9. 南航计算机考研专业课复习重点
  10. 批处理注释bat注释一行_注释和注释处理器入门指南