设计模式之工厂

来源:互联网 发布:unity3d 鼠标点击移动 编辑:程序博客网 时间:2024/05/17 01:16

设计模式之工厂

1.简单工厂(Simple factory)


2.工厂方法

1.定义

定义了一个创建对象的接口,但由子类决定更要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

工厂方法模式能封装具体类型的实例化。在抽象的Creator中,任何其他实现的方法,都可能创建这个工厂方法所制造出来的产品,==但只有子类真正实现这个工厂方法并创建产品==

注意:定义中“由子类决定要实例化的类是哪一个”,所谓的“决定”,并不是指模式允许子类在运行时做决定,而是在编写创建者时,不需要知道实际创建的产品是哪一个。在运行时客户选择使用哪个子类,自然就决定了实际创建的产品是什么。

个人理解:
这个模式的优点有:

  1. 把对象的创建放在方法里,而不是直接new,这样除了不需要直接new对象(避免了针对实现编程),还能在方法里添加了各种逻辑,能更精确的控制对象的产生。(如可以添加参数等)

  2. 创建者是一个超类(抽象类、接口),产品也是一个超类,在创建者类里的用于生产产品(创建对象)工厂方法也是抽象的,而且返回值是产品;这意味着:

    1. 任何实现了创建者类的子类都必须重写这个工厂方法,不同的子类对这个方法可以有不同的重写,从而可以生产不同的产品。如果想生产新品种的产品,只需要创建一个新的实现了创建者类的类然后重写这个方法即可,原来的代码完全不受影响,很正做到了OCP
    2. 返回值是抽象的产品,创建类的其他方法可以继续用这个返回值。根据里氏替换原则,任何父类出现的地方子类都能出现。这就是说,子类返回的产品都能继续被创建者类的其他方法所使用,做到了面向接口编程。

2.形式

abstract Product factoryMethod(Sring type)
  • 工厂方法是抽象的,所以子类必须重写工厂方法,也就是说,依赖子类重写的不同来创建不同的对象

  • 必须返回一个产品。超类中定义的方法,通常使用到工厂方法的返回值。(返回值也是超类,这样就能返回它的所有子类

  • 工厂方法将客户和实际创建具体产品的代码分割开来
  • 可以有参数,也可以没有参数. ==参数化的创建方式克服了Factory Method模式一个最显著的缺陷,就是当具体产品比较多时,我们不得不也建立一系列与之对应的具体构造器. 但是在客户端我们必须指定参数来决定要创建哪一个类==



2. 依赖倒置原则(Dependency Inversion Principle)

==要依赖抽象,不要依赖具体类!!!==

不能让高层组件依赖于低层组件,而且,不管高层或者低层,两者都应该依赖于抽象。

指导方针

  1. 变量不可以持有具体类的引用

    如果使用直接new对象,就会持有具体类的引用。可以改用工厂来避开这样的做法。

  2. 不要让类派生字具体类

    如果派生自具体类,就会依赖这个具体类。==要派生自一个抽象类或接口。==

  3. 不要覆盖基类中的已经实现的方法。

    如果覆盖基类已经实现了的方法,意味着这个基类并不是一个真正适合被继承的抽象。==基类中已经实现了的方法,应该由子类共享==



3.抽象工厂

1.定义

==提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。==

允许客户使用抽象的接口创建一组相关的产品,而不需要知道实际产出的具体产品室什么。这样依赖,客户就从具体的产品中被解耦。

抽象工厂里内含工厂方法

抽象工厂的任务是==定义一个负责创建一组产品的接口==。接口内的每个方法都负责创建一个产品
我们利用==实现抽象工厂的子类通过对这些方法不同的重写来生产具体的产品==。所以在抽象工厂中里利用工厂方法是实现生产方法是相当自然的做法。



4.对比工厂方法和抽象工厂

工厂方法:目前还不知道将来需要实例化哪些具体类时可以使用

  • 利用工厂方法创建对象,需要扩展一个类,并覆盖它的工厂方法。
  • 说白了就是==通过子类来创建对象==
  • 用这种做法,客户只需要知道他们所使用的抽象类型就可以,而又子类来负责决定具体类型

抽象工厂:想创建产品家族和想让制造的相关产品集合起来时使用

  • 可以把一群相关的产品(产品家族)集合起来
  • 对象的创建被实现在工厂接口所暴露出来的方法中
  • 但是缺点是不方便添加新产品(如果要添加新产品,那么抽象工厂的这个大接口便要改,实现它的子类全部都要改)
  • 负责在抽象工厂中创建产品的方法通常是由==工厂方法==来实现!
0 0
原创粉丝点击