设计模式-抽象工厂模式(AbstractFactory)
抽象工厂模式是向客户端提供一个接口(FruitFactory),,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族(NorthFruit、SouthFruit)的产品对象。
角色和职责:
1.抽象工厂(factory)-FruitFactory:
抽象工厂模式的核心,包含对多个产品接口的说明,任何工厂类都必须实现这个接口
2.具体工厂(concrete factory)-NorthFruitFactory、SouthFruitFactory:
负责实例化某个产品族(比如apple,apple的产品族是NorthApple、SouthApple)中的产品对象
3.抽象产品(product)-Apple、Banana:
抽象模式所创建的所有对象的父类,它负责所有实例所共有的公共接口
4.具体产品(concrete product)-NorthApple、SouthApple、NorthBanana、SouthBanana:
UML图:
具体代码:
/** * 水果接口 */ public interface Fruit { void pick(); }
/** * 抽象苹果类 */ public abstract class Apple implements Fruit{ public abstract void pick(); }
/** * 抽象香蕉类 */ public abstract class Banana implements Fruit{ public abstract void pick(); }
/** * 北方苹果 */ public class NorthApple extends Apple{ @Override public void pick() { System.out.println("采摘北方苹果"); } }
/** * 采摘北方香蕉 */ public class NorthBanana extends Banana{ @Override public void pick() { System.out.println("采摘北方香蕉"); } }
/** * 南方苹果 */ public class SouthApple extends Apple{ @Override public void pick() { System.out.println("采摘南方苹果"); } }
/** * 南方香蕉 */ public class SouthBanana extends Banana{ @Override public void pick() { System.out.println("采摘南方香蕉"); } }
/** * 水果工厂接口 */ public interface FruitFactory { Fruit getApple(); Fruit getBanana(); }
/** * 北方水果工厂 */ public class NorthFruitFactory implements FruitFactory { @Override public Fruit getApple() { return new NorthApple(); } @Override public Fruit getBanana() { return new NorthBanana(); } }
/** * 南方水果工厂 */ public class SouthFruitFactory implements FruitFactory{ @Override public Fruit getApple() { return new SouthApple(); } @Override public Fruit getBanana() { return new SouthBanana(); } }
public class Main { public static void main(String[] args) { FruitFactory northFruitFactory = new NorthFruitFactory();//北方水果工厂 Fruit northApple = northFruitFactory.getApple();//生产苹果 northApple.pick(); Fruit northBanana = northFruitFactory.getBanana();//生产香蕉 northBanana.pick(); FruitFactory southFruitFactory = new SouthFruitFactory();//南方水果工厂 Fruit southApple = southFruitFactory.getApple();//生产苹果 southApple.pick(); Fruit southBanana = southFruitFactory.getBanana();//生产香蕉 southBanana.pick(); } }
结果:
采摘北方苹果
采摘北方香蕉
采摘南方苹果
采摘南方香蕉
优缺点:
优:
- 抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建
- 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象
- 增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。
缺:增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性
应用场景:
抽象工厂是应对产品族概念的。比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。
应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。
源码:https://github.com/qjm201000/design_pattern_abstractFactory.git