时光飞逝,小成的注塑厂在良好的经营管理之下获得了不错的经济效益,但是他们的厂之前都是只做塑料容器产品的生产,现在想发展新的产品方向,做塑料模具。小成想了想新学到的抽象工厂模式,也把代码给改了。
介绍
抽象工厂模式可以说是工厂模式的一种扩展,提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的类。也就是说可以通过调用工厂类里面的不同方法来生产对应的不同的产品类。
package scut.designmodel.AbstractFactoryPattern;
//容器产品抽象类
abstract class ContainerProduct extends Product{
@Override
public abstract void Show();
}
//模具产品抽象类
abstract class MouldProduct extends Product{
@Override
public abstract void Show();
}
//工厂抽象类
abstract class Factory{
public abstract Product ManufactureContainer();
public abstract Product ManufactureMould();
}
//抽象产品类
abstract class Product{
public abstract void Show();
}
//容器产品A类
class ContainerProductA extends ContainerProduct{
@Override
public void Show() {
System.out.println("生产出了容器产品A");
}
}
//容器产品B类
class ContainerProductB extends ContainerProduct{
@Override
public void Show() {
System.out.println("生产出了容器产品B");
}
}
//模具产品A类
class MouldProductA extends MouldProduct{
@Override
public void Show() {
System.out.println("生产出了模具产品A");
}
}
//模具产品B类
class MouldProductB extends MouldProduct{
@Override
public void Show() {
System.out.println("生产出了模具产品B");
}
}
//容器工厂类
class FactoryA extends Factory{
@Override
public Product ManufactureContainer() {
return new ContainerProductA();
}
@Override
public Product ManufactureMould() {
return new MouldProductA();
}
}
//模具工厂类
class FactoryB extends Factory{
@Override
public Product ManufactureContainer() {
return new ContainerProductB();
}
@Override
public Product ManufactureMould() {
return new MouldProductB();
}
}
public class AbstractFactoryPattern {
public static void main(String[] args){
FactoryA mFactoryA = new FactoryA();
FactoryB mFactoryB = new FactoryB();
//客户需要容器产品A
mFactoryA.ManufactureContainer().Show();
//客户需要容器产品B
mFactoryB.ManufactureContainer().Show();
//客户需要模具产品A
mFactoryA.ManufactureMould().Show();
//客户需要模具产品B
mFactoryB.ManufactureMould().Show();
}
}
结果:
生产出了容器产品A
生产出了容器产品B
生产出了模具产品A
生产出了模具产品B
应用场景
- 一个系列要独立于他的产品的创建、组合、表示时。
- 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。
- 当要强调一系列相关的产品对象的设计以便进行联合使用时。
- 总的来说,即是适用于客户端中需要经常切换配置(交换产品系列)的时候,客户端可以通过抽象几口来操纵实例,具体的类名不会出现在客户端中。在很多软件系统中需要更换界面主题,要求界面中的按钮、文本框、背景色等一起发生改变时,可以使用抽象工厂模式进行设计。
优点
- 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易,符合高内聚低耦合的设计目的
- 当一个产品系列中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品系列中的对象。
- 增加新的具体工厂和产品类很方便,无须修改已有系统,符合开闭原则。
缺点
- 在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及到对抽象工厂角色及其所有子类的修改,显然会带来较大的不便。
- 抽象工厂模式以一种倾斜的方式支持增加新的产品,它为新产品系列的增加提供方便,但不能为新的产品等级结构的增加提供这样的方便。这种称为开闭原则的倾斜性(增加新的工厂和产品系列容易,增加新的产品等级结构麻烦)。
参考
《设计模式其实很简单》,刘径舟,张玉华等编著——清华大学出版社,2013.7