系统开发和现实生活是一样的。在现实生活中一个复杂的商品都是通过一个工厂产生,具体工厂怎么产生的我们不需在乎。在软件设计上也可如此,如果一个对象的创建过程比较复杂,便可考虑使用工厂模式。

简单工厂模式

简单工厂模式的定义: 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。

按实际业务场景划分,工厂模式有 3 种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。

我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”

简单来说,简单工厂模式有一个具体的工厂类,可以生成多个不同的产品,属于创建型设计模式。简单工厂模式不在 GoF 23 种设计模式之列。

简单工厂模式每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度,违背了“开闭原则”。

“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。

过于简单,以及不实用所以不作举例说明。


工厂方法模式

因简单工厂模式违背了开闭原则,工厂方法模式是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足了开闭原则

模式的结构与实现

工厂方法模式由抽象工厂、具体工厂、抽象产品、具体产品等四个要素构成

模式的结构

工厂方法模式的主要角色如下:

  1. 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
  2. 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
  3. 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
  4. 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

示例场景:客户要根据自行车的品牌名获得一辆自行车。

  • 一个抽象工厂:自行车工厂,生产自行车的工厂都实现此抽象工厂,这样就满足了开闭原则
  • 有两个具体工厂:捷安特工厂、喜德盛工厂。
  • 一种产品:自行车
  • 两个具体产品:捷安特自行车、喜德盛自行车。
package com.wly.DesignPatterns;
public class AbstractFactoryTest {public static void main(String[] args) {//抽象商品Bike bike;//抽象工厂BikeFactory bikeFactory;try {System.out.println("需求一:");System.out.println("我要一辆捷安特自行车");//使用品牌名创建工厂String brand = "GiantFactory";//获得具体工厂Class<?> c = Class.forName("com.wly.DesignPatterns."+brand);bikeFactory = (BikeFactory)c.newInstance();//创建自行车bike = bikeFactory.newBike();bike.show();}catch (Exception e){System.out.println("没有此品牌自行车工厂");}try {System.out.println("需求二:");System.out.println("我要一辆喜德盛自行车");//使用品牌名创建工厂String brand = "XdsFactory";//获得具体工厂Class<?> c = Class.forName("com.wly.DesignPatterns."+brand);bikeFactory = (BikeFactory)c.newInstance();//创建自行车bike = bikeFactory.newBike();bike.show();}catch (Exception e){System.out.println("没有此品牌自行车工厂");}}
}
/**抽象工厂:提供产品的生成方法*/
interface BikeFactory{/**生成产品*/Bike newBike();
}
/**具体工厂1:生成具体的产品*/
class GiantFactory implements BikeFactory{@Overridepublic Bike newBike() {return new GiantBike();}
}
/**具体工厂2:生成具体的产品*/
class XdsFactory implements BikeFactory{@Overridepublic Bike newBike() {return new XdsBike();}
}
/**抽象产品*/
interface Bike{/**产品接口*/void show();
}
/**具体产品1*/
class GiantBike implements Bike{@Override    public void show() {System.out.println("捷安特自行车");}
}
/**具体产品2*/
class XdsBike implements Bike{@Override    public void show() {System.out.println("喜德盛自行车");}
}

输出:

需求一:
我要一辆捷安特自行车
捷安特自行车
需求二:
我要一辆喜德盛自行车
喜德盛自行车

抽象工厂模式

前面说了工厂模式,可是一个工厂的产品往往不止一种。例如:腾讯公司不仅仅产方便我们沟通联系的聊天软件产品,还产供我们休闲娱乐的游戏产品。比亚迪不仅仅生产汽车,在今年疫情还生产起了口造等等例子。

抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。

优点:抽象工厂模式就是在工厂模式的基础上,增加了工厂生产产品的种类。这样抽象工厂模式可以生产多种产品。多个产品可以在同一个类中共同管理

模式的结构与实现

结构与工厂模式相同,实现上抽象方法的个数不同。因为与工厂模式相差甚小,所以不做示例实现。

软件设计模式之路-----工厂模式抽象工厂模式相关推荐

  1. 软件设计模式之工厂模式抽象工厂模式

    一.工厂模式 工厂方法模式(别名:虚拟构造):定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. 工厂方法模式的关键是在一个接口或抽象类中 ...

  2. C++设计模式之一 工厂模式(简单工厂、工厂和抽象工厂)

    今天开始这个系列之前,心里有些恐慌,毕竟园子里的高手关于设计模式的经典文章很多很多,特别是大侠李会军.吕震宇 老师的文章更是堪称经典.他们的文笔如行云流水,例子活泼生动,讲解深入浅出.好在他们都是用C ...

  3. JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·抽象工厂——理解“开放封闭”

    JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·抽象工厂--理解"开放封闭" 一个不简单的简单工厂引发的命案 在实际的业务中,我们往往面对的复杂度并非数个类 ...

  4. (创建模式 上)设计模式——工厂、抽象工厂 C++/Python3实现

    简介 设计模式是为了解决一些出现的问题设计的解决方案.是长时间经验的总结,是根据不同问题从而提出并且实践出来的解决办法.使用不同的设计模式可以解决不同的问题. 设计模式可以分为三种大类别:分别是创建型 ...

  5. Head First设计模式读书笔记四 简单工厂 工厂模式 抽象工厂模式

    本文示例代码材料源自Head First设计模式 以前整理自己整理的链接: 工厂模式 https://blog.csdn.net/u011109881/article/details/56541580 ...

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

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

  7. 研磨23种大话设计模式------简单工厂模式 + 工厂方法模式 + 抽象工厂模式

    大家好,我是一位在java学习圈中不愿意透露姓名并苟且偷生的小学员,如果文章有错误之处,还望海涵,欢迎多多指正 如果你从本文 get 到有用的干货知识,请帮忙点个赞呗,据说点赞的都拿到了offer 简 ...

  8. 设计模式-创建型模式-抽象工厂模式

    工程源码:设计模式-创建型模式-抽象工厂模式https://download.csdn.net/download/qq_40788199/85544119 码云:设计模式-创建型模式-抽象工厂模式ht ...

  9. 设计模式(十)------23种设计模式(3):抽象工厂模式

    转载自:https://www.cnblogs.com/chenpi/p/5156801.html (风一样的码农) 阅读目录 使用频率:★★★★★ 一.什么是抽象工厂模式 二.补充说明 三.角色 四 ...

  10. 软件架构设计师-创建型模式-单例模式-原型模式-工厂方法模式-抽象工厂模式-建造者模式

    文章目录 1.单例模式 2.原型模式 3.工厂方法(Factory Method)模式 4.抽象工厂(AbstractFactory)模式 5.建造者(Builder)模式 6.作者答疑   在面向对 ...

最新文章

  1. java 图像采集_JAVA B/S通过摄像头采集图片信息解决方案。
  2. php上传图片 中文,php图片上传方法
  3. 使用librdkafka的C++接口实现简单的生产者和消费者
  4. CodeForces - 617E XOR and Favorite Number(莫队)
  5. 深度学习在CV领域的进展以及一些由深度学习演变的新技术
  6. 国内ip信息库的组建
  7. Pyqt5转化.ui文件到.py文件
  8. mysql 设计超市订单图,JSP+MySQL校园网络超市系统的设计与实现
  9. java模拟器触屏_jar模拟器-jar模拟器触屏版电脑版下载_暂未上线|好特下载
  10. 二级c语言考试用的编译软件下载,二级c语言模拟考试软件下载
  11. 虚拟机安装教程win10_Parallels Desktop如何安装windowns系统?PD虚拟机安装win10系统详细教程
  12. Windows 模块安装程序必须更新,才能安装此程序包。 请更新计算机上的 Windows 模块安装程序,然后重试安装。问题解决
  13. 张锋因何错过诺贝尔化学奖?
  14. 如何创建维恩图,用这个工具就可以了!
  15. 最近网上比较火的虎年西游记金钱豹头像制作小程序源码
  16. 2023年1月21日除夕活动取消通知
  17. 2018-11-21(34)《阿里铁军》阅后记!
  18. Linux-基本指令02
  19. 读书笔记--青年文摘摘抄
  20. 黑马程序员 银行业务调度系统

热门文章

  1. manjaro装rime和plum
  2. (基于matlab的)应变传感器数据处理方法(电阻-应变)
  3. javastudy-43:小孩报数问题
  4. word文档 尾注参考文献
  5. 添加PATHPATH的方式
  6. 镁光 M4 128G 在H61 上IDE,AHCI测试
  7. 新狼邮箱服务器,搭建简单的邮件服务器+动态域名在互联网中使用
  8. eclipse常用插件,最实用的插件
  9. java导出数据到word文档中
  10. Java学习笔记(视频:韩顺平老师)2.0