设计模式专题-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)的软件
- 图标ICON类:show()方法-米粒化
- 协议Protocol类:Communication()-米规则
- 图标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通信规则 锤子图标 锤子通信规则
|