理解设计模式——创建型模式(2)抽象工厂模式
2020-07-13 04:30
99 查看
抽象工厂模式
抽象工厂模式结构:
- 若干个抽象产品 -->(理解成产品模板)
- 若干个具体产品 -->(可扩展)
- 一个抽象工厂 -->(理解成工厂模板)
- 若干个具体工厂 -->(可扩展)
抽象工厂模式特点:
抽象工厂模式和工厂模式似乎没什么区别,从结构上来看似乎就是由工厂模式的一个抽象产品,变成了多个抽象产品而已。真是这样吗?没啥毛病,本来就是这样(可参考下面代码),当然这只是形式上的区别而已。后来我在知乎看到一个很棒的回答,一语道破抽象工厂模式和工厂模式在思想上的区别:
这里不多做解释,先上码,最后再解释总结。
讲个故事
话接上回,说逆丰快递公司为送快递,自己造车造飞机。没想到公司非但没有走乐视的老路玩脱,反而愈发壮大。现在公司老总觉得自己更行了,所以自己造运输工具都不满意,还要培训自己的飞行员和司机!
与此同时公司架构也进行了调整。原来的飞机制造厂和卡车制造厂没有了,取而代之的是空中运输分公司和陆地运输分公司,二者不仅要承担造飞机和造卡车的任务,同时还要负责培训飞机驾驶员和卡车驾驶员。
先看抽象产品和具体产品:
// 抽象产品1:交通工具 public interface Transport { void load(); void travel(); } // 具体产品(交通工具)1:飞机 public class Airplane implements Transport { public Airplane(){ System.out.println("生产了一架737"); } @Override public void load() { System.out.println("飞机带货"); } @Override public void travel() { System.out.println("飞机在天上行驶"); } } // 具体产品(交通工具)2:卡车 public class Truck implements Transport { public Truck(){ System.out.println("生产了一辆江淮"); } @Override public void load() { System.out.println("卡车带货"); } @Override public void travel() { System.out.println("卡车在路上行驶"); } } // 抽象产品2:驾驶员 public interface Driver { void operate(); } // 具体产品(驾驶员)1:飞行员 public class AirplaneDriver implements Driver { public AirplaneDriver(){ System.out.println("培养出一位飞行员"); } @Override public void operate() { System.out.println("飞行员驾驶737翩翩起舞"); } } // 具体产品(驾驶员)2:卡车司机 public class TruckDriver implements Driver { public TruckDriver(){ System.out.println("培养出一位货车司机"); } @Override public void operate() { System.out.println("货车司机驾驶江淮漂移"); } }
再看抽象工厂和具体工厂部分:
// 抽象工厂 public abstract class BranchTrafficCompany { public BranchTrafficCompany(){ System.out.println("这是一个运输子公司"); } public abstract Transport createTransport(); public abstract Driver driverTrain(); } // 具体工厂1:空运分公司 public class AirTrafficCompany extends BranchTrafficCompany { @Override public Transport createTransport() { System.out.println("空运分公司造了一架飞机"); return new Airplane(); } @Override public Driver driverTrain() { System.out.println("空运分公司培训了一位飞行员"); return new TruckDriver(); } } // 具体工厂2:陆运分公司 public class GroundTrafficCompany extends BranchTrafficCompany { @Override public Transport createTransport() { System.out.println("陆运分公司造了一辆卡车"); return new Truck(); } @Override public Driver driverTrain() { System.out.println("陆运分公司培训了一位卡车司机"); return new AirplaneDriver(); } }
最后看一下客户端如何获取具体对象:
public class client { public static void main(String[] args){ BranchTrafficCompany airCompany = new AirTrafficCompany(); Transport plane = airCompany.createTransport(); Driver pilot = airCompany.driverTrain(); BranchTrafficCompany groundCompany = new GroundTrafficCompany(); Transport truck = groundCompany.createTransport(); Driver truckDriver = groundCompany.driverTrain(); } }
抽象工厂模式总结:
- 工厂模式和抽象工厂模式的具体产品有什么区别?前者只有一个抽象产品,而后者又两个或多个。换个说法就是,前者只有一种产品(运输工具),而后者有多种(运输工具+驾驶员)。
- 工厂模式和抽象工厂模式的具体工厂有什么区别?工厂名字高大上了,工厂模式里叫“飞机/卡车制造厂”,到了抽象工厂模式里变成“空运/陆运分公司”了。原因倒也不难理解,因为不仅要造飞机(或卡车),还要培训飞行驾驶员(卡车驾驶员)。
- 可以看到,抽象工厂模式中的每个具体工厂不仅生产出了多个对象,而且维持了多个对象间的关系:飞机和飞机驾驶员始终是在一起的,而卡车和卡车驾驶员始终是在一起的。这种工具+驾驶员成对出现的抽象关系是在抽象工厂中定义的(即对具体工厂进行了抽象)。
- 个人对工厂模式和抽象工厂模式异同的理解:工厂模式的重点是对具体产品的抽象,而抽象工厂的模式是对具体工厂的抽象。
- 回过头去看工厂模式,其中的抽象工厂类是可以去掉的(个人认为必要性不是很大),去掉之后只剩具体工厂,再来和抽象工厂模式比较,区别一目了然。
共同学习,欢迎交流!
这里是源码demo
相关文章推荐
- 设计模式(6)——抽象工厂模式(Abstract Factory Pattern,创建型)
- 设计模式理解之工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)
- 设计模式-创建型-抽象工厂模式
- 设计模式复习笔记 (4)创建型模式:抽象工厂模式
- 三、设计模式之抽象工厂模式(创建型)
- C#面向对象设计模式 学习之旅(三) - Abstract Factory 抽象工厂模式(创建型)...
- Java设计模式之工厂模式(包括简单工厂模式、工厂方法模式、抽象工厂模式=>创建型模式)
- (3)设计模式之抽象工厂模式(创建型模式)
- "围观"设计模式(8)--创建型之简单工厂模式、工厂方法模式、抽象工厂模式
- 设计模式学习总结1 - 创建型1 - Abstract Factory抽象工厂模式
- 设计模式学习(创建型模式)—抽象工厂模式(Abstract Factory)
- 创建型设计模式-抽象工厂模式
- Java设计模式(2)创建型:工厂模式(工厂方法模式与抽象工厂模式)
- 设计模式 -创建型模式 ,工厂模式 抽象工厂模式(1)
- 【C#设计模式——创建型模式】抽象工厂模式
- 从Java的角度理解设计模式85: 继续演化:对违反DIP原则的修复和应用创建型模式的展望
- 设计模式之创建型模式---抽象工厂模式
- 对于创建型设计模式理解
- 抽象工厂模式 创建型 设计模式(四)
- 简单理解设计模式之抽象工厂模式