设计模式之抽象工厂模式(五)

来到了最后的工厂模式,抽象工厂模式。这个工厂模式应该是工厂模式的终极形态了,顾名思义抽象,它真的挺抽象的,但是如果你可以理解工厂方法模式的话,这个模式应该也不会太难。它与工厂方法模式的区别在于抽象工厂接口不再只生产一个抽象产品,而是一堆抽象产品,抽象产品接口也不止一个,而是有很多个。

定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

以上定义与类图来自百度百科

这个设计模式曾经把我绕的很晕很晕,因为这个模式工厂与产品的关系再也不是一个工厂生产对应一个产品了,一个抽象工厂生产的是一系列各种各样的产品,具体的工厂实现类实现生产一系列产品的不同实现,抽象产品接口也不只是一个了,而是一系列,对应抽象工厂中一系列的产品生产。这里我们模拟生产手机的粗略过程。下面上代码!

首先给出产品接口,一个手机工厂可能需要生产很多配件,这里只造两个,分别为机身和CPU配件。

package test;
//产品之机身
public interface BodyComponent {

	public void Body_Mothod();

}
package test;
//产品之CPU
public interface CPUComponent {

	public void CPU_Mothod();

}

具体产品的实现。

package test;
//Iphone机身
public class IphoneBodyComponent implements BodyComponent {

	@Override
	public void Body_Mothod() {
		System.out.println("Iphone专用机身");
	}
}
package test;
//Iphone的CPU
public class IphoneCPUComponent implements CPUComponent {

	@Override
	public void CPU_Mothod() {
		System.out.println("iphone专用CPU");
	}

}

package test;
//华为机身
public class HUAWEIBodyComponent implements BodyComponent {

	@Override
	public void Body_Mothod() {
		System.out.println("HUAWEI专用机身");
	}
}

package test;
//华为CPU
public class HUAWEICPUComponent implements CPUComponent {

	@Override
	public void CPU_Mothod() {
		System.out.println("HUAWEI专用CPU");
	}

}

接下来是抽象工厂接口,一个手机工厂。

package test;

public interface MobileFactory {

	public BodyComponent createBody();

	public CPUComponent createCPU();

}

两个具体工厂的实现。首先是生产苹果手机的工厂。

package test;

public class IPHONE implements MobileFactory {

	@Override
	public BodyComponent createBody() {
		return new IphoneBodyComponent();
	}

	@Override
	public CPUComponent createCPU() {
		return new IphoneCPUComponent();
	}

}
然后是生产华为手机的工厂


package test;

public class HUAWEI implements MobileFactory {

	@Override
	public BodyComponent createBody() {
		return new HUAWEIBodyComponent();
	}

	@Override
	public CPUComponent createCPU() {
		return new HUAWEICPUComponent();
	}

}

这样就完成了一个抽象工厂模式,接下来看客户端实现吧。

package test;

public class testA {
	public static void main(String[] args) {

		System.out.println("用苹果工厂生产手机机身和CPU");
		MobileFactory mobileFactory = new IPHONE();
		BodyComponent body = mobileFactory.createBody();
		CPUComponent CPU = mobileFactory.createCPU();

		body.Body_Mothod();
		CPU.CPU_Mothod();

		System.out.println("---------------------------");

		System.out.println("用华为工厂生产手机机身和CPU");
		mobileFactory = new HUAWEI();
		body = mobileFactory.createBody();
		CPU = mobileFactory.createCPU();

		body.Body_Mothod();
		CPU.CPU_Mothod();

	}
}

控制台打印


到这里我们可以看出,抽象产品模式是为了处理产品有多个的情况,而且这些产品大多数都应该是有关系的,就像机身和CPU,都是手机工厂需要生产的产品。而且产品接口的数量,在抽象工厂生成之后就已经固定,就相当于手机工厂生成后已经固定是生产机身和CPU了,对应的产品也就是机身和CPU,而对于不同工厂,是可以生产和对应工厂有关系的机身和CPU,就像苹果工厂只是生产机身产品中苹果的机身,CPU产品中苹果的CPU。

总结一下三篇工厂模式吧。

首先从简单工厂模式进化到工厂方法模式。简单工厂模式每增加一个产品,就需要对工厂类进行修改,违反了开闭原则。而工厂方法模式改善了这一点,具体的工厂类变成一个工厂接口,之后增加产品只需要增加对应工厂即可,对扩展开放,且解决了简单工厂模式对修改开放的弊端。

再是工厂方法模式到抽象工厂模式。工厂方法模式存在一个弊端,就是随着产品的增加工厂也随之增加,代码会越来越多。抽象产品模式则可以生产一系列的产品,就像上述例子,每个工厂都可以生产一堆一系列的产品,很好解决了产品有多个的情况。

注:由于我的水平有限,有些地方说的可能有问题?欢迎大家指出,互相讨论互相学习进步!

猜你喜欢

转载自blog.csdn.net/qq_41737716/article/details/80530386