java设计模式--抽象工厂模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 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()方法,然后两个实现类都要修改……说到这里,已经知道了扩展的弊端了……

        注意这里是产品族扩展比较困难,而不是产品等级扩展困难。产品等级扩展还是非常容易的,增加一个产品等级,只要增加一个工厂类负责新增加出来的产品生产任务即可。也就是说横向扩展容易,纵向扩展难。


猜你喜欢

转载自blog.csdn.net/qq_37415950/article/details/81042771