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

Abstract Factory(抽象工厂)

目标

提供一个无需指定的类而可以创建一系列相关的对象的接口。

结构

抽象工厂

由一个Abstract Factory类派生出多个子类工厂,子类工厂将会提供相应的创建产品的方法。对于客户来说,只需要获得Abstract Factory类中的接口就可以实现各类产品的创建。(与工厂方法有一点区别在抽象工厂一般是生成一系列相互有关系的产品,工厂模式方法一般就是生成某一个产品)

适用情形

  1. 一个系统要独立于它的产品的创建、组合和表示时;

  2. 一个系统要由多个产品系列的一个来配置时;

  3. 当你强调一系列相关产品对象的设计以便联合使用的时候;

  4. 当你提供一个产品类库,而只想显示他们的接口而不是实现。

参与成员

  • AbstractFactory

    声明创建抽象产品对象的操作接口。

  • ConcreteFactory

    实现创建具体产品对象的操作。

  • AbstractProduct

    为一类产品对象声明一个接口。

  • ConcreteProduct

    将被具体工厂实现的具体产品对象。

  • Client

    使用Abstract接口的接口。

效果

  1. 分离了具体的类,提高解耦度。

    它将客户与类的实现分离开,客户通过手中有的抽象工厂接口操纵。产品的类名也在具体工厂的实现中分离,不会出现在客户代码中。客户不必知道自己到底获得了怎样实现的一个类。

  2. 易于改变产品的系列。

    由于具体的工厂方法只会在初始化的时候出现一次,所以想要改变产品的系列只需要转换到相应的工厂对象,就可以重新创建一系列的产品。

  3. 有利于产品的一致性。

    当一个系列的产品对象被设计成一起工作或者一个应用只能使用一个系列的产品的时候,抽象工厂就可以很轻易地实现这一个功能。

  4. 难以支持新的产品(或者说功能?)

代码实例

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

Powered by Hexo and Hexo-theme-hiker

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

Yifeng Tang hält Urheberrechtsansprüche.