版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37415950/article/details/81042771
1 背景
上一章节我们说到了造车,当是客户经理忘记了一件很重要的事情,忘记车还分手动挡和自动挡了,所有这次就用抽象工厂来实现了。
然后我们就开始分析了,首先当然是车啦,然后各种型号下又分别有手动挡和自动挡
2 UML
代码:
/**
* 车
* @author pengkun
*
*/
public interface Car {
void getCar();
}
/**
* 秦
* @author pengkun
*
*/
public abstract class QinCar implements Car {
@Override
public void getCar() {
System.out.println("制造了一辆比亚迪秦");
}
}
public class QinCarSD extends QinCar {
@Override
public void getCar() {
System.out.println("制造了一辆比亚迪秦,手动挡");
}
}
public class QinCarZD extends QinCar {
@Override
public void getCar() {
System.out.println("制造了一辆比亚迪秦,自动挡");
}
}
//这里就写一种类型了。。其他类似省略了
工厂
public interface AbstractFactoryCar {
Car createQin();
Car createTang();
Car createSong();
}
/**
* 手动挡
* @author pengkun
*
*/
public class SDAbstractFactory implements AbstractFactoryCar {
@Override
public Car createQin() {
return new QinCarSD();
}
@Override
public Car createTang() {
return new TangCarSD();
}
@Override
public Car createSong() {
return new SongCarSD();
}
}
/**
* 自动挡
* @author pengkun
*
*/
public class ZDAbstractFactory implements AbstractFactoryCar {
@Override
public Car createQin() {
return new QinCarZD();
}
@Override
public Car createTang() {
return new TangCarZD();
}
@Override
public Car createSong() {
return new SongCarZD();
}
}
测试:
@Test
public void test() {
AbstractFactoryCar factorySD=new SDAbstractFactory();
AbstractFactoryCar factoryZD=new ZDAbstractFactory();
Car sd1=factorySD.createQin();
Car sd2=factorySD.createTang();
sd1.getCar();
sd2.getCar();
Car zd1=factoryZD.createQin();
Car zd2=factoryZD.createTang();
zd1.getCar();
zd2.getCar();
}
结果:
制造了一辆比亚迪秦,手动挡
制造了一辆比亚迪唐,手动挡
制造了一辆比亚迪秦,自动挡
制造了一辆比亚迪唐,自动挡
总结:
优点
封装性。每个产品的实现类不是高层模块要关心的,它要关心的是接口,是抽象,它不关心对象是如何创建出来的,这都由工厂类负责的,只要知道工厂类是谁,我就能创建一个需要的对象,省时省力。
缺点
抽象工厂模式最大的缺点就是产品族扩展非常困难。如果我们要增加一个产品C,也就是说产品族由原来的A和B增加到3个,那么我们首先要在抽象类AbstractCreator中增加createProductC()方法,然后两个实现类都要修改……说到这里,已经知道了扩展的弊端了……
注意这里是产品族扩展比较困难,而不是产品等级扩展困难。产品等级扩展还是非常容易的,增加一个产品等级,只要增加一个工厂类负责新增加出来的产品生产任务即可。也就是说横向扩展容易,纵向扩展难。