zoukankan      html  css  js  c++  java
  • 工厂模式

    一、工厂模式的由来

    二、简单工厂模式

    例子:创建一个ICourse课程接口:

    创建一个JavaCourse实现类:

    创建一个PythonCourse实现类:

    创建一个CourseFactory类,用来生成JavaCourse或PythonCourse对象:

    创建一个SimpleFactoryTest测试类,来看客户端调用:

    类关系结构图:

    1、简单工厂模式(Simple Factory Pattern):指由一个工厂对象决定创建出哪一种产品类的实例。(属于创建型模式,但它不属于GOF(四位作者)的23种设计模式之一)

    2、目的:减少代码冗余程度,提高代码的复用性。

    3、适用场景

    • 工厂类负责创建的对象较少
    • 客户端只需要传入工厂类的参数,对于如何创建对象的逻辑不需要关心

    4、优点:只需传入一个正确的参数,就可以获取你所需要的对象,无需知道其创建的细节。

    5、缺点

    • 工厂类的职责相对过重,增加新的产品时,如果产品存在差异化的逻辑,则需要修改工厂类的判断逻辑,违背开闭原则
    • 不易于扩展过于复杂的产品结构

    三、工厂方法模式

    (简单工厂模式的升级版)

    例子:创建一个ICourseFactory接口,也可以是抽象类(超级工厂):

    创建一个JavaCourseFactory工厂实现类,用来生成JavaCourse对象:

    创建一个JavaCourseFactory工厂实现类,用来生成PythonCourse对象:

    创建一个FactoryMethodTest测试类,来看客户端调用:

    类结构关系图:

    1、工厂方法模式(Factory Method Pattern):指定义一个创建对象的工厂接口,但让实现这个接口的工厂类来决定实例化哪个类,工厂方法模式让类的实例化推迟到子类中进行。(属于创建型模式)

    2、目的:解决创建多个产品的职责问题,遵循开闭原则、单一职责原则。(不同的产品,用不同的工厂来创建,即不同的工厂负责不同产品差异化的创建逻辑)

    3、适用场景

    • 创建对象需要大量重复的代码(超级工厂可以定义为抽象类,把公共的逻辑放在该类的非抽象方法中,让子类在实现抽象方法的同时还可以调用父类的非抽象方法,提高代码的复用性)
    • 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
    • 一个类通过其子类来指定创建哪个对象

    4、优点

    • 用户只需关系所需产品对应的工厂,无需关心创建细节
    • 加入新产品符合开闭原则,提高了系统的可扩展性

    5、缺点

    • 类的个数容易过多,增加了代码结构的复杂度
    • 增加了系统的抽象性和理解难度

    四、抽象工厂模式

    (方法工厂模式的升级版,不遵循开闭原则,但易于扩展。每种设计模式都有其优缺点,不能因为它不符合开闭原则就不使用,要结合业务场景

    讲解抽象工厂之前,先了解两个概念:产品等级结构、产品族。

    从上图中可以看出有正方形、圆形和菱形三种图形,相同颜色深浅的就表示同一个产品族,相同形状的代表同一个产品等级结构。同样可以从生活中来举例,比如美的电器生产多种家用电器。那么上图中,颜色最深的正方形可以代表美的洗衣机、颜色最深的圆形代表美的空调、颜色最深的菱形代表美的热水器,颜色最深的一排都属于美的品牌,都是美的电器这个产品族。再看最右侧的菱形,颜色最深的既然代表了美的热水器,那么第二排颜色稍浅的菱形代表海尔热水器。同理,同一产品结构下还有格力热水器、格力空调、格力洗衣机。

    再看下面这张图,最左侧的小房子我们就认为具体的工厂,有美的工厂、海尔工厂、格力工厂。每个品牌的工厂都生产洗衣机、热水器和空调。

    例子:创建一个ICourseFactory接口或抽象类:

    创建两个产品接口INote、IVideo:

    创建两个实现类JavaNote、JavaVideo:

    创建一个JavaCourseFactory类:

    创建一个JavaCourseFactory类:

    创建一个AbstractFactoryTest测试类,来看客户端调用:

    类关系结构图:

    1、抽象工厂模式(Abstract Factory Pattern):指提供一个创建一系列相关或相互依赖对象的接口,无需指定他们具体的类。(属于创建型模式)

    2、目的:解决更加复杂的业务场景。

    3、适用场景

    • 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
    • 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码
    • 提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现

    4、优点

    • 具体产品在应用层代码隔离,无需关心创建细节(遵循单一职责原则)
    • 将一个系列的产品族统一到一起创建

    5、缺点

    • 规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口
    • 增加了系统的抽象性和理解难度
  • 相关阅读:
    python入门之json与pickle数据序列化
    python入门之迭代器
    python入门之生成器
    阿里云-域名免费申请ssl证书过程
    mongodb的基本命令操作
    kibana通过nginx配置访问用户验证
    Java中常用的加密算法MD5,SHA,RSA
    Weka关联规则分析
    Swing实现系统托盘
    Swing实现右下角消息框
  • 原文地址:https://www.cnblogs.com/ZekiChen/p/12424259.html
Copyright © 2011-2022 走看看