定义:java
抽象工厂模式提供一个接口,用于建立相关或者依赖对象的家族,而不须要明确指定具体类。ide
抽象工厂容许客户端使用抽象的接口来建立一组相关的产品,而不须要关系实际产出的具体产品是什么。这样一来,客户就能够从具体的产品中被解耦。ui
示例代码:设计
Fruit.java对象
package com.designPattern.abstractFactory; /*** * * @author liuzhihu * */ public interface Fruit { /*** * 定义吃水果的方法 */ public void eatFruit(); }
Apple.javablog
package com.designPattern.abstractFactory; /*** * * @author liuzhihu * */ public abstract class Apple implements Fruit { public abstract void eatFruit(); }
Banana.java接口
package com.designPattern.abstractFactory; /*** * * @author liuzhihu * */ public abstract class Banana implements Fruit { public abstract void eatFruit(); }
NorthApple.javaget
package com.designPattern.abstractFactory; public class NorthApple extends Apple { @Override public void eatFruit() { System.out.println("吃北方苹果。。。。。。"); } }
NorthBanana.java产品
package com.designPattern.abstractFactory; public class NorthBanana extends Banana { @Override public void eatFruit() { System.out.println("吃北方香蕉。。。。。。"); } }
SouthApple.javait
package com.designPattern.abstractFactory; public class SouthApple extends Apple { @Override public void eatFruit() { System.out.println("吃南方苹果。。。。。。"); } }
SouthBanana.java
package com.designPattern.abstractFactory; public class SouthBanana extends Banana { @Override public void eatFruit() { System.out.println("吃南方香蕉。。。。。。"); } }
FruitFactory.java
package com.designPattern.abstractFactory; public abstract class FruitFactory { /*** * 采集水果 * * @param type * @return */ public abstract Fruit getFruit(String type); }
NorthFruitFactory.java
package com.designPattern.abstractFactory; public class NorthFruitFactory extends FruitFactory { @Override public Fruit getFruit(String type) { if ("Apple".equals(type)) { return new NorthApple(); } else if ("Banana".equals(type)) { return new NorthBanana(); } else { System.out.println("找不到对应的水果......"); return null; } } }
SouthFruitFactory.java
package com.designPattern.abstractFactory; public class SouthFruitFactory extends FruitFactory { @Override public Fruit getFruit(String type) { if ("Apple".equals(type)) { return new SouthApple(); } else if ("Banana".equals(type)) { return new SouthBanana(); } else { System.out.println("找不到对应的水果......"); return null; } } }
MainTest.java
package com.designPattern.abstractFactory; public class MainTest { public static void main(String[] args) { // 北方水果 NorthFruitFactory northFruitFactory = new NorthFruitFactory(); Fruit northApple = northFruitFactory.getFruit("Apple"); northApple.eatFruit(); Fruit northBanana = northFruitFactory.getFruit("Banana"); northBanana.eatFruit(); // 南方水果 SouthFruitFactory southFruitFactory = new SouthFruitFactory(); Fruit southApple = southFruitFactory.getFruit("Apple"); southApple.eatFruit(); Fruit southBanana = southFruitFactory.getFruit("Banana"); southBanana.eatFruit(); } }
优势
一、 抽象工厂隔离了具体类的生成,是的客户端不须要知道什么被建立。全部的具体工厂都实现了抽象工厂中定义的公共接口,所以只须要改变具体工厂的实例,就能够在某种程度上改变整个软件系统的行为。
二、 当一个产品族中的多个对象被设计成一块儿工做时,它可以保证客户端始终只使用同一个产品族中的对象。
缺点
添加新的行为时比较麻烦。若是须要添加一个新产品族对象时,须要更改接口及其下全部子类,这必然会带来很大的麻烦。