首页 > 其他分享 >学习笔记-设计模式-创建型模式-工厂模式

学习笔记-设计模式-创建型模式-工厂模式

时间:2023-09-06 11:48:22浏览次数:35  
标签:子类 笔记 工厂 实例 模式 产品 创建 设计模式

工厂模式

工厂模式是一种创建者设计模式,细分之下可以分成三类简单工厂模式工厂方法模式抽象工厂模式

简单工厂模式

最简单的工厂模式,它采用静态方法的方式来决定应该应该生产什么商品。

public class StoreFactory {

    public static ICommodity getCommodityService(Integer commodityType) {
        if (null == commodityType) {
            return null;
        }

        switch (commodityType) {
            case 1:
                return new CouponCommodityService();
            case 2:
                return new GoodsCommodityService();
            case 3:
                return new CardCommodityService();
        }

        throw new RuntimeException("不存在的商品服务类型");
    }

}

它的优点在于

  • 将创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建,实现了解耦
  • 把初始化实例时的工作放到工厂里进行,使代码更容易维护,更符合面向对象的原则面向接口编程,而不是面向实现编程

它的缺点在于

  • 工厂类集中了所有实例的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响
  • 违背开闭原则,一旦添加新的产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂
  • 简单工厂模式使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构

它适用于

  • 客户只知道传入工厂类的参数,对于如何创建对象的逻辑不关心时;
  • 当工厂类负责创建的对象比较少时。

工厂方法模式

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

它把类的实例化延迟到工厂类的子类中,由子类来决定应该实例化哪个类。

由此,它解决了简单工厂模式违背了开闭原则的问题。

000.png

它的优点在于

  • 更符合开闭原则
  • 符合单一责任原则,每个具体工厂类只负责创建对应的产品
  • 不使用静态工厂方法,可以形成基于继承的等级结构

它的缺点在于

  • 需要的类的数量非常多,每添加一个新产品,就要相应的添加一个新的工厂。
  • 虽然保证了工厂方法内的对修改关闭,但对于使用工厂方法的类,如果要更换另一种产品,仍然需要修改实例化的具体工厂类
  • 一个工厂只能创建一种具体产品

它适用于:

  • 当一个类不需要知道它所需要的对象的类时
  • 当一个类希望通过其子类来指定创建对象时
  • 将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时无须关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂的类名存储在配置文件或数据库中(比如spring中的FactoryBean)

抽象工厂模式

抽象工厂模式定义了一个能生产一个产品族的超级抽象工厂,然后交给子类工厂去生产某一个产品族的产品。

产品族和产品等级

001.png

产品等级结构既是产品的继承结构。比如一个抽象类是电视机,其子类有海尔电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构。

产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔生产的海尔电视机、海尔洗衣机和海尔冰箱,构成了一个产品族。

设计模式详解

002.png

图中,IProductFactory是工厂接口,定义了生产手机和路由器组成的产品族的方法。而子类工厂HuaweiFactory负责生产华为产品族,XiaomiFactory负责生产小米产品族。

另外,IPhoneProductIRouterProduct分别定义了手机和路由器两个产品等级。

它的优点在于

  • 一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象
  • 可以很方便地添加一个新的产品族

它的缺点在于

  • 产品族的拓展非常困难,要增加一个系列的某一个产品,既要修改工厂抽象类里添加代码,又要在具体的实现类里面添加代码
  • 增加了系统的抽象性和理解难度

它适用于

  • 一系列相关产品对象(属于同一产品族)一起创建时需要大量的重复代码
  • 提供一个产品类的库,所有的产品以同样的接口出现,从而使得客户端不依赖于具体的实现

标签:子类,笔记,工厂,实例,模式,产品,创建,设计模式
From: https://www.cnblogs.com/Andl-Liu/p/17681898.html

相关文章

  • 《Head First Java》学习笔记2--接口、构造函数与垃圾收集器
    接口:Java的接口就像是100%的纯抽象类接口的方法都带有public和abstract意义,这两个修饰符是属于选择性的完全不同的继承树的类可以实现相同的接口,使用接口就像是说“不管来自哪里,只要实现这个接口,别人就会知道你一定会履行这个合约”当用接口来作为多态......
  • 《Head First Java》学习笔记1--抽象类
    最近在看《HeadFirstJava》,HeadFirst系列就是奔着通俗易懂去的,作为对java掌握还不深,先把这本书看透,打一个好的基础抽象类除了被继承之外,是没有用途、没有值,没有目的的抽象类可以有static成员抽象的类代表此类必须要被extend过,抽象的方法代表此方法一定要被覆盖......
  • rtos学习笔记_2023年09月05日
    0123456789101112131415161718192021222324......
  • 【JS】JS笔记
    JS笔记初识JS浏览器执行JS简介浏览器分为:渲染引擎:用来解析HTML和CSS,俗称内核。比如chrome的blinkJS引擎:也成为JS解释器,用来读取JS代码并对其进行后台处理。比如chrome的V8JS的组成ECMAScript:JavaScript语法,规定了JS的编程语法和基础核心知识,是所有浏览器厂商共同遵循......
  • 【CSS】CSS笔记
    CSS笔记CSS就是美化网页的。CSS是层叠样式表(CascadingStyleSheets)的简称。有时也称为CSS样式表或级联样式表。也是一种标记语言。CSS简介选择器+声明h1{color:red;...}选择器{属性:值}CSS代码风格样式格式书写:展开格式,一个样式写一行。样式大小写:小写......
  • 笔记5-vivado IP 时钟 -单端时钟输入
     这里选MMCM进行配置    用例化来调用IP,先找到生成IP后,接口例化的地方,软件已经自动例化好,只需将下面这段拷贝到工程文件中进行调用 拷贝到led_prj.v文件中1`timescale1ns/1ps2/////////////////////////////////////////////////////////////////......
  • Go学习笔记1
    学习路线2023-Go全链路工程师课纲https://www.processon.com/view/link/63594cd97d9c0854f9ac855e一、搭建环境https://studygolang.com/dlmsi需要自己安装安装目录最好没有中文1.简单dos命令进入磁盘D:,C:查看目录结构dir进入目录......
  • 新人笔记-集合2.0
    importjava.util.ArrayList;/*publicbooleanremove(Object)删除指定的元素,返回删除是否成功publicEremove(intindex)删除指定索引处的元素,返回被删除的元素publicEset(intindex.Eelement)修改指定索引处的元素,返回被修改的元素publicEget(intin......
  • 【原创】基于QT编写的支持IPv4/IPv6双协议栈,TCP/UDP双模式,DLL内存加载的模块化远控木
    本人已经本科毕业一年有余,在平常实习过程中,发现大佬都对我的本科毕设--双协议栈远控木马感兴趣。据我所知,目前流行的C2远控软件中,MSF支持IPv4和IPv6,但是MSF生成的单个木马只是支持其中的一种协议,而不是双协议栈。CobaltStrike目前尚无IPv6的使用案例。其他支持双协议栈的C2软件......
  • 《C++并发编程实战》读书笔记(4):原子变量
    1、标准原子类型标准原子类型的定义位于头文件<atomic>内。原子操作的关键用途是取代需要互斥的同步方式,但假设原子操作本身也在内部使用了互斥,就很可能无法达到期望的性能提升。有三种方法来判断一个原子类型是否属于无锁数据结构:所有标准原子类型(std::atomic_flag除外,因为它......