1.定义
抽象工厂模式是所有形态的工厂模式最为抽象和最其一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。
2.产品族和产品等级结构
3.模式中包含的角色及其职责
- 抽象工厂角色(Creator)-- 抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口
- 具体工厂角色(Concrete Creator)-- 具体工厂类是抽象工厂的一个实现,负责实现某个产品族中的产品对象
- 抽象角色(Product)-- 抽象模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口
- 具体产品角色(Concrete Product)-- 抽象gong模式所创建的具体实例对象
总结:抽象工厂中方法对应产品结构,具体工厂对应产品族。
4.代码演示
package test.com.abstractFactory; /** * Product(抽象角色) */ public interface Fruit { public void get(); }
package test.com.abstractFactory; public abstract class Apple implements Fruit { public abstract void get(); }
package test.com.abstractFactory; public abstract class Banana implements Fruit { public abstract void get(); }
package test.com.abstractFactory; /** * Concrete Product(具体产品角色) */ public class NorthApple extends Apple { @Override public void get() { System.out.println("采集北方苹果"); } }
package test.com.abstractFactory; /** * Concrete Product(具体产品角色) */ public class SouthApple extends Apple { @Override public void get() { System.out.println("采集南方苹果"); } }
package test.com.abstractFactory; /** * Concrete Product(具体产品角色) */ public class NorthBanana extends Banana { @Override public void get() { System.out.println("采集北方香蕉"); } }
package test.com.abstractFactory; /** * Concrete Product(具体产品角色) */ public class SouthBanana extends Banana { @Override public void get() { System.out.println("采集南方香蕉"); } }
package test.com.abstractFactory; /** * Creator(抽象工厂角色) */ public interface FruitFactory { public Fruit getApple(); public Fruit getBanana(); }
package test.com.abstractFactory; /** * Concrete Creator(具体工厂角色) */ public class NorthFruitFactory implements FruitFactory { @Override public Fruit getApple() { return new NorthApple(); } @Override public Fruit getBanana() { return new NorthBanana(); } }
package test.com.abstractFactory; /** * Concrete Creator(具体工厂角色) */ public class SouthFruitFactory implements FruitFactory { @Override public Fruit getApple() { return new SouthApple(); } @Override public Fruit getBanana() { return new SouthBanana(); } }
package test.com.abstractFactory; /** * 测试 */ public class MainClass { public static void main(String[] args) { FruitFactory ff = new NorthFruitFactory(); Fruit f = ff.getApple(); f.get();//采集北方苹果 Fruit f1 = ff.getBanana(); f1.get();//采集北方香蕉 FruitFactory ff2 = new SouthFruitFactory(); Fruit f2 = ff2.getApple(); f2.get();//采集南方苹果 Fruit f3 = ff2.getBanana(); f3.get();//采集南方香蕉 } }