• 工厂模式浅析


    @

    工厂模式主要分为简单工厂模式、工厂方法模式、抽象工厂模式,我们常说的工厂模式指的就是工厂方法模式。其中简单工厂模式不属于23种设计模式。

    简单工厂模式

    简单工厂模式并不属于23种设计模式,只是属于一种习惯,一种写代码的习惯

    定义

    一个工厂类根据传入不同的参数返回不同的实例,所有的实例都有共同的父类或者接口。

    使用场景

    • 由于只有一个工厂类,所以必须保证工厂类里面创建对象的逻辑不能过于复杂
    • 工厂类对外屏蔽了创建对象的过程,客户端获取对象的创建是无感知的

    实例

    一个可以绘制圆形、正方形、长方形的绘图器
    1、定义通用接口

    -w337

    2、创建圆形、正方形、长方形具体的实例对象
    -w456
    -w441
    -w481

    3、创建工厂实现类
    -w660

    4、获取对象
    -w537
    通过传入不同的参数获取对象创建图形

    工厂方法模式

    工厂方法模式中,针对不同的对象提供不同的工厂,每个对象都有一个与之对应的工厂,koi是定义一个用于创建对象的接口,让子类决定初始化哪一个类,将实例化延迟到其子类。

    定义

    定义一个用于创建对象的接口,让子类决定将哪一个类实例化

    使用场景

    • 客户端不需要知道它所创建的对象的类。只知道创建它的工厂名就完成了创建过程。
    • 客户端可以通过子类来指定创建对应的对象。

    实例

    -w963

    以计算器为例,有加减乘除
    1、首先定义一个计算的抽象类,有两个计算参数和计算结果的方法
    -w423
    2、定义加减乘除具体方法继承了运算类
    -w395

    -w400

    -w609

    -w365

    3、定义工厂方法接口
    -w312

    4、定义具体的工厂类
    -w462

    -w455

    -w445

    -w451

    5、具体调用
    -w685

    与简单工厂模式的区别

    简单工厂模式的最大优点在于工厂类中包含了必要的判断逻辑,根据客户的条件动态的实例化相关的类,对于客户端来说,没有具体产品的依赖,但是问题也是在这里,如果需要实现一个新的计算功能,就需要加一个分支判断逻辑,那么就违背了开闭原则。
    而工厂方法模式中,把工厂类抽象出一个接口,这个接口就是创建抽象产品的工厂方法,然后所有要生产具体类的工厂就去实现这个接口,这样去添加一个新的计算功能的时候,就不用去修改原有的代码,只需要新增一个生产具体类的工厂和运算类即可,符合开闭原则。
    工厂方法就是把简单工厂内部的判断逻辑移到了客户端代码进行,这就是如果要新加功能,原来是改工厂类代码,而现在是改客户端代码。

    抽象工厂模式

    这个模式并不符合开闭原则。实际开发还需要做好权衡。抽象工厂模式是工厂方法的仅一步深化,在这个模式中的工厂类不单单可以创建一个对象,而是可以创建一组对象。这是和工厂方法最大的不同点。

    定义

    提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。( 在抽象工厂模式中,每一个具体工厂都提供了多个工厂方法用于产生多种不同类型的对象)
    可以分为四部分
    AbstractFactory(抽象工厂):声明了一组用于创建对象的方法,注意是一组。
    ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建对象的方法,生成一组具体对象。 AbstractProduct(抽象产品):它为每种对象声明接口,在其中声明了对象所具有的业务方法。ConcreteProduct(具体产品):它定义具体工厂生产的具体对象。

    使用场景

    • 和工厂方法一样客户端不需要知道它所创建的对象的类。
    • 需要一组对象共同完成某种功能时。并且可能存在多组对象完成不同功能的情况

    实例

    -w697
    以跨平台UI类为例:
    1、定义抽象产品Button和Checkbox
    -w272

    -w291

    2、定义抽象工厂GUIFactory

    -w354

    3、定义具体产品MacButton、MacCheckBox,分别继承对应的抽象产品
    -w523

    -w572

    4、定义具体产品WinButton、WinCheckBox,分别继承对应的抽象产品
    -w540

    -w523

    5、定义具体工厂,实现了抽象工厂

    -w602

    -w582

    6、客户端调用
    -w683

  • 相关阅读:
    关于思考力
    2019第24周日
    提高收入的方法
    工作中的管理
    技术是解决问题的一种手段
    Django的事务性
    shell单引号与变量、双引号与变量、如何在多重引号里面取到shell变量的值?
    django外键以及主表和子表的相互查询
    django数据模型中 null=True 和 blank=True 有什么区别?
    Django静态文件的加载以及STATIC_URL、 STATIC_ROOT 、STATICFILES_DIRS的区别
  • 原文地址:https://www.cnblogs.com/binbinshan/p/14231970.html
Copyright © 2020-2023  润新知