设计模式-04-抽象工厂模式

设计模式专题-04-抽象工厂模式

个人github地址:HibisciDai

设计模式系列项目源码:HibisciDai/DesignPattern-LearningNotes-HibisciDai

processon在线UML类图:processon

[TOC]

设计模式-04-抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)

意图

提供一个创建一系列相关或者相关依赖对象的接口,而不需指定他们具体的类。

主要解决

接口选择。

何时使用

系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

关键代码

在一个工厂里聚合多个同类产品。

如何解决

在一个产品族里面,定义多个产品。

应用实例

  • QQ 换皮肤,一整套一起换。
  • 生成不同操作系统的程序。

优点

当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点

产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

注意事项

产品族难扩展,产品等级易扩展。

案例1

暴力摩托游戏,游戏有两种模式。普通模式,开摩托拿AK47;魔法模式,骑扫把拿魔法棒。

类图

代码

pattern04.abstractFactory.demo1

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
public interface IVehicle {
void run();
}

public class Broom implements IVehicle {
@Override
public void run() {
System.out.println("Broom-fly");
}
}

public class Moto implements IVehicle {
@Override
public void run() {
System.out.println("Moto-run");
}
}

public interface IWeapon {
public void attack();
}

public class AK47 implements IWeapon {
@Override
public void attack() {
System.out.println("AK47-attack");
}
}

public class MagicStick implements IWeapon {
@Override
public void attack() {
System.out.println("MagicStick-attack");
}
}

public interface AbstractFactory {
public IVehicle createVehicle();
public IWeapon createWeapon();
}

public class DefaultFactory implements AbstractFactory {
@Override
public IVehicle createVehicle() {
return new Moto();
}

@Override
public IWeapon createWeapon() {
return new AK47();
}
}

public class MagicFactory implements AbstractFactory {
@Override
public IVehicle createVehicle() {
return new Broom();
}

@Override
public IWeapon createWeapon() {
return new MagicStick();
}
}

测试输出

1
2
3
4
5
6
7
8
9
10
11
public class Main {
public static void main(String[] args) {
AbstractFactory myAbstractFactory = new DefaultFactory();
myAbstractFactory.createVehicle().run();
myAbstractFactory.createWeapon().attack();

AbstractFactory myAbstractFactory2 = new MagicFactory();
myAbstractFactory2.createVehicle().run();
myAbstractFactory2.createWeapon().attack();
}
}
1
2
3
4
Moto-run
AK47-attack
Broom-fly
MagicStick-attack

案例2

开发一款手机虚拟机(Virtual Device)的软件

  • 小米虚拟机(MVD)
  • 图标ICON类:show()方法-米粒化
  • 协议Protocol类:Communication()-米规则
  • IOS虚拟机(IVD)
  • 图标ICON类:show()方法-扁平化
  • 协议Protocol类:Communication()-IOS规则

未来扩展锤子手机:Smartisan的虚拟机(SVD)

类图

代码

pattern04.abstractFactory.demo2

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
public interface IICON {
public void show();
}

public class MiICON implements IICON {
@Override
public void show() {
System.out.println("小米图标");
}
}

public class FlatICON implements IICON {
@Override
public void show() {
System.out.println("IOS图标");
}
}

public interface IProtocol {
public void communication();
}

public class MiRules implements IProtocol {
@Override
public void communication() {
System.out.println("小米通信规则");
}
}

public class IOSRules implements IProtocol {
@Override
public void communication() {
System.out.println("IOS通信规则");
}
}

public interface IAbstractFactory {
public IICON createICON();
public IProtocol createIProtocol();
}

public class MVDFactory implements IAbstractFactory {
@Override
public IICON createICON() {
return new MiICON();
}

@Override
public IProtocol createIProtocol() {
return new MiRules();
}
}

public class IVDFactory implements IAbstractFactory {
@Override
public IICON createICON() {
return new FlatICON();
}

@Override
public IProtocol createIProtocol() {
return new IOSRules();
}
}

扩展代码

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
public class SmarICON implements IICON {
@Override
public void show() {
System.out.println("锤子图标");
}
}

public class SmarRules implements IProtocol {
@Override
public void communication() {
System.out.println("锤子通信规则");
}
}

public class SVDFactory implements IAbstractFactory {
@Override
public IICON createICON() {
return new SmarICON();
}

@Override
public IProtocol createIProtocol() {
return new SmarRules();
}
}

测试输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Main {
public static void main(String[] args) {
IAbstractFactory iAbstractFactory1 = new MVDFactory();
iAbstractFactory1.createICON().show();
iAbstractFactory1.createIProtocol().communication();

IAbstractFactory iAbstractFactory2 = new IVDFactory();
iAbstractFactory2.createICON().show();
iAbstractFactory2.createIProtocol().communication();

IAbstractFactory iAbstractFactory3 = new SVDFactory();
iAbstractFactory3.createICON().show();
iAbstractFactory3.createIProtocol().communication();
}
}
1
2
3
4
5
6
小米图标
小米通信规则
IOS图标
IOS通信规则
锤子图标
锤子通信规则
文章作者: HibisciDai
文章链接: http://hibiscidai.com/2018/03/26/设计模式-04-抽象工厂模式/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HibisciDai
好用、实惠、稳定的梯子,点击这里