您的位置:首页 > 其它

理解设计模式——创建型模式(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();
}
}

抽象工厂模式总结:

  1. 工厂模式和抽象工厂模式的具体产品有什么区别?前者只有一个抽象产品,而后者又两个或多个。换个说法就是,前者只有一种产品(运输工具),而后者有多种(运输工具+驾驶员)。
  2. 工厂模式和抽象工厂模式的具体工厂有什么区别?工厂名字高大上了,工厂模式里叫“飞机/卡车制造厂”,到了抽象工厂模式里变成“空运/陆运分公司”了。原因倒也不难理解,因为不仅要造飞机(或卡车),还要培训飞行驾驶员(卡车驾驶员)。
  3. 可以看到,抽象工厂模式中的每个具体工厂不仅生产出了多个对象,而且维持了多个对象间的关系:飞机和飞机驾驶员始终是在一起的,而卡车和卡车驾驶员始终是在一起的。这种工具+驾驶员成对出现的抽象关系是在抽象工厂中定义的(即对具体工厂进行了抽象)。
  4. 个人对工厂模式和抽象工厂模式异同的理解:工厂模式的重点是对具体产品的抽象,而抽象工厂的模式是对具体工厂的抽象
  5. 回过头去看工厂模式,其中的抽象工厂类是可以去掉的(个人认为必要性不是很大),去掉之后只剩具体工厂,再来和抽象工厂模式比较,区别一目了然。

共同学习,欢迎交流!
这里是源码demo

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: