设计模式——创建型模式(三)

Factory Method(工厂方法)

目标

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

结构

结构图

工厂方法被自己的子类所重定义以决定创建哪一个产品对象。

协作

时序图

  1. 用户创建一个工厂;

  2. 工厂生产一个产品;

  3. 用户直接使用或者调用产品的方法。

适用情形

  1. 当一个类不知道它所必需创建的对象的类的时候;

  2. 当一个类希望由它的子类来制定它所创建的对象的时候;

  3. 当类创建对象的职责委托给多个子类中的一个,并且你希望选择某个子类使得具体产品明确化的时候。

参与者

  • Product

    定义工厂方法所创建的对象的接口;

  • ConcreteProduct

    实现Product的接口;

  • Creator

    声明工厂方法,定义一个具体工厂来生产产品,并且调用工厂方法以返回一个Product;

  • ConcreteCreator

    重定义一个具体的工厂方法。

效果

  1. 将与特定相关产品的代码与你的代码分离,你只需要关心product而不是用户可能会实现出来的各种concreteProduct;

  2. 为子类提供了一个hook,这个hook可以帮助提供对象的扩展版本。例如,有一个汽车工厂,该工厂可以生产小汽车,后来这个工厂老板又去开了一家高级汽车厂。这时候,这个汽车厂既可以用原来的方法生产普通汽车,也可以继承之后生产生产高级汽车,此时父类工厂方法已不是一个抽象的方法,而是一个default方法。

  3. 连接平行的类层次。当一个类将自己的某些功能委托给另一个独立的类的时候,便产生了平行的类层次。例如,有一个类用于判定学生的试卷得分多少,但是最后这个分数将不会存储在自己身上,而是在另一个类之中。此时,这个分数就是从判定分数的类中的工厂方法中生产的,这样就实现了平行的分层。

与抽象工厂模式的异同

  • 异:

    对于一个抽象工厂模式,它更加倾向于强调一系列产品的生产以及调整改变产品系列;对于工厂方法,仅是为了某一个产品的生产。

  • 实际上在某种方面来说,抽象工厂模式囊括了工厂方法。也就是说抽象工厂方法可以用工厂方法来实现。

代码实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
interface AbstractFactory{
Car makeCar();
}
class BenzFactory implements AbstractFactory{
@Override
Benz makeCar() {}
}
class AudiFactory implements AbstractFactory{
@Override
Audi makeCar() {}
}
public class Client {
public void static main(String[] args){
AbstractFactory factoryA = new BenzFactory();
AbstractFactory factoryB = new AudiFactory();
Car a = factoryA.makeCar();
Car b = factoryB.makeCar();
a.run();
b.run();
}
}

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2018 Alex's Blog All Rights Reserved.

Yifeng Tang hält Urheberrechtsansprüche.