一、基本概念。
1、 说明:抽象工厂模式是对工厂方法模式的改进,用于处理产品不只有一类的情况(多产品类型或者产品族概念)。抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。
2、角色:
A:AbstractFactory:声明一个创建抽象产品对象的操作接口。
B:ConcreteFactory:实现创建具体产品对象的操作。
C:AbstractProduct:为一类产品对象声明一个接口。
D:ConcreteProduct:定义一个将被相应具体工厂创建的产品对象,以实现AbstractProduct接口。
E:Client:测试方法
二、简单例子
A:AbstractFactory:抽象工厂,制造瓶子和瓶酒。
1 package comm.pattern.create.abstractFactory; 2 3 /** 4 * 5 * @Title: AbstractFactory.java 6 * @Package: comm.pattern.create.abstractFactory 7 * @Description: 描述该文件做什么 8 * @author yangzhancheng 9 * @2020年3月26日:下午10:39:18 10 * 11 */ 12 public abstract class AbstractFactory { 13 14 abstract public IBottle createBottle(); 15 abstract public IBeer createBeer(); 16 }
B:ConcreteFactory:
B-1:青岛啤酒场
1 package comm.pattern.create.abstractFactory; 2 3 /** 4 * 5 * @Title: TsingtaoFactory.java 6 * @Package: comm.pattern.create.abstractFactory 7 * @Description: 青岛工厂 8 * @author yangzhancheng 9 * @2020年3月26日:下午10:41:18 10 * 11 */ 12 public class TsingtaoFactory extends AbstractFactory { 13 14 //玻璃瓶 15 @Override 16 public IBottle createBottle() { 17 return new GlassBottle(); 18 } 19 20 //青岛啤酒 21 @Override 22 public IBeer createBeer() { 23 return new TsingtaoBeer(); 24 } 25 26 }
B-2:百威啤酒厂
1 package comm.pattern.create.abstractFactory; 2 3 /** 4 * 5 * @Title: BudweiserFactory.java 6 * @Package: comm.pattern.create.abstractFactory 7 * @Description: 百威工厂 8 * @author yangzhancheng 9 * @2020年3月26日:下午10:46:32 10 * 11 */ 12 public class BudweiserFactory extends AbstractFactory { 13 14 //易拉罐 15 @Override 16 public IBottle createBottle() { 17 return new CansBottle(); 18 } 19 20 //百威啤酒 21 @Override 22 public IBeer createBeer() { 23 return new BudweiserBeer(); 24 } 25 26 }
C:AbstractProduct:
C-1:啤酒
1 package comm.pattern.create.abstractFactory; 2 3 /** 4 * 5 * @Title: Beer.java 6 * @Package: comm.pattern.create.abstractFactory 7 * @Description: 描述该文件做什么 8 * @author yangzhancheng 9 * @2020年3月26日:下午9:09:48 10 * 11 */ 12 13 public interface IBeer { 14 void name(); 15 }
C-2:啤酒瓶
1 package comm.pattern.create.abstractFactory; 2 3 /** 4 * 5 * @Title: IBottle.java 6 * @Package: comm.pattern.create.abstractFactory 7 * @Description: 描述该文件做什么 8 * @author yangzhancheng 9 * @2020年3月26日:下午10:00:42 10 * 11 */ 12 13 public interface IBottle { 14 void name(); 15 }
D:ConcreteProduct:
D-1:百威啤酒
1 package comm.pattern.create.abstractFactory; 2 3 /** 4 * 5 * @Title: BudweiserBeer.java 6 * @Package: comm.pattern.create.abstractFactory 7 * @Description: 描述该文件做什么 8 * @author yangzhancheng 9 * @2020年3月26日:下午10:20:50 10 * 11 */ 12 public class BudweiserBeer implements IBeer{ 13 14 public void name(){ 15 System.out.println("百威啤酒..."); 16 } 17 }
D-2:青岛啤酒
1 package comm.pattern.create.abstractFactory; 2 3 /** 4 * 5 * @Title: TsingtaoBeer.java 6 * @Package: comm.pattern.create.abstractFactory 7 * @Description: 描述该文件做什么 8 * @author yangzhancheng 9 * @2020年3月26日:下午10:21:34 10 * 11 */ 12 public class TsingtaoBeer implements IBeer{ 13 14 public void name(){ 15 System.out.println("青岛啤酒..."); 16 } 17 }
D-3:易拉罐
1 package comm.pattern.create.abstractFactory; 2 3 /** 4 * 5 * @Title: CansBottle.java 6 * @Package: comm.pattern.create.abstractFactory 7 * @Description: 易拉罐 8 * @author yangzhancheng 9 * @2020年3月26日:下午10:32:45 10 * 11 */ 12 public class CansBottle implements IBottle { 13 14 @Override 15 public void name() { 16 System.out.println("易拉罐->"); 17 } 18 19 }
D-4:玻璃瓶
1 package comm.pattern.create.abstractFactory; 2 3 /** 4 * 5 * @Title: GlassBottle.java 6 * @Package: comm.pattern.create.abstractFactory 7 * @Description: 玻璃瓶操作 8 * @author yangzhancheng 9 * @2020年3月26日:下午10:36:00 10 * 11 */ 12 public class GlassBottle implements IBottle { 13 14 @Override 15 public void name() { 16 System.out.println("玻璃瓶->"); 17 } 18 19 }
E:Client:测试方法
1 package comm.pattern.create.abstractFactory; 2 3 /** 4 * 5 * @Title: Client.java 6 * @Package: comm.pattern.create.abstractFactory 7 * @Description: 客户端测试文件 8 * @author yangzhancheng 9 * @2020年3月26日:下午10:47:38 10 * 11 */ 12 public class Client { 13 14 public static void main(String[] args) { 15 System.out.println("------百威的工厂模拟-----------"); 16 AbstractFactory bwFactory = new BudweiserFactory(); 17 IBottle cansBottle = bwFactory.createBottle(); 18 IBeer budweiserBeer = bwFactory.createBeer(); 19 cansBottle.name(); 20 budweiserBeer.name(); 21 22 System.out.println("------青岛的工厂模拟-----------"); 23 AbstractFactory tsFactory = new TsingtaoFactory(); 24 IBottle glassBottle = tsFactory.createBottle(); 25 IBeer tsingtaoBeer = tsFactory.createBeer(); 26 glassBottle.name(); 27 tsingtaoBeer.name(); 28 } 29 30 }
允许结果:
------百威的工厂模拟----------- 易拉罐-> 百威啤酒... ------青岛的工厂模拟----------- 玻璃瓶-> 青岛啤酒...
三、总结
后续补充。