概述
抽象工厂提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂又称为其他工厂的工厂,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。
使用场景
- 不要求依赖类实例如何被创建、组合和表达的表达
- 系统有多个系列,而系统中只消费其中某一系列
- 提供一个类库,以同样的接口出现,调用者不需要依赖具体实现。
优点
- 抽象工厂模式将具体类的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展
缺点
- 抽象工厂模式很难支持新系列的变化。这是因为抽象工厂接口中已经确定了可以被创建的系列集合,如果需要添加新系列,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变
代码示例
实现
一个基础接口定义了功能,子类实现该接口;然后定义一个工厂接口,具体工厂实现工厂接口;
新增基础接口的实现类,只需要同时新增一个工厂类,调用端就可以轻松调用新产品的代码
还是以工厂模式中的容器作为背景,之前的无论是普通工厂、多方法工厂、静态工厂,当新增实现类时都需要修改已存在的代码。下面看看增加工厂接口后的实现
定义基础接口
package com.designpattern.abstractfactory;
public interface Container {
public void getName();
public void getShap();
public void getColor();
}
实现基础接口
package com.designpattern.abstractfactory;
public class Can implements Container {
@Override
public void getName() {
// TODO Auto-generated method stub
System.err.println("can name:can");
}
@Override
public void getShap() {
// TODO Auto-generated method stub
System.err.println("can shap:cycle");
}
@Override
public void getColor() {
// TODO Auto-generated method stub
System.err.println("can color:green");
}
}
package com.designpattern.abstractfactory;
public class Cup implements Container {
@Override
public void getName() {
// TODO Auto-generated method stub
System.err.println("Cup name:Cup");
}
@Override
public void getShap() {
// TODO Auto-generated method stub
System.err.println("Cup shap:cylinder");
}
@Override
public void getColor() {
// TODO Auto-generated method stub
System.err.println("Cup Color:white");
}
}
package com.designpattern.abstractfactory;
public class Bottle implements Container {
@Override
public void getName() {
// TODO Auto-generated method stub
System.err.println("bottle name:bottle");
}
@Override
public void getShap() {
// TODO Auto-generated method stub
System.err.println("bottle shap:cylinder");
}
@Override
public void getColor() {
// TODO Auto-generated method stub
System.err.println("bottle Color:black");
}
}
定义工厂接口
package com.designpattern.abstractfactory;
public interface FactoryIntf {
public Container getContainer();
}
实现工厂接口
package com.designpattern.abstractfactory;
public class FactoryBottle implements FactoryIntf {
@Override
public Container getContainer() {
// TODO Auto-generated method stub
return new Bottle();
}
}
package com.designpattern.abstractfactory;
public class FactoryCan implements FactoryIntf {
@Override
public Container getContainer() {
// TODO Auto-generated method stub
return new Can();
}
}
package com.designpattern.abstractfactory;
public class FactoryCup implements FactoryIntf {
@Override
public Container getContainer() {
// TODO Auto-generated method stub
return new Cup();
}
}
测试
package com.designpattern.abstractfactory;
public class TestMain {
public static void main(String[] args) {
FactoryIntf factoryIntf = new FactoryBottle();
factoryIntf.getContainer().getName();
}
}
运行结果:
bottle name:bottle
现在若需要研发一个新的产品,比如托盘
只需要新增一个基础接口的实现类和一个工厂的实现类,无需修改原来的代码
package com.designpattern.abstractfactory;
public class Salver implements Container {
@Override
public void getName() {
// TODO Auto-generated method stub
System.err.println("Salver name:Salver ");
}
@Override
public void getShap() {
// TODO Auto-generated method stub
System.err.println("Salver shap:cylinder");
}
@Override
public void getColor() {
// TODO Auto-generated method stub
System.err.println("Salver Color:white");
}
}
package com.designpattern.abstractfactory;
public class FactorySalver implements FactoryIntf {
@Override
public Container getContainer() {
// TODO Auto-generated method stub
return new Salver();
}
}
上面的例子是最基础的例子,比如增加相互依赖的对象
比如:在工厂模式里使用了生产容器的例子,那么在抽象工厂模式中我们增加一个包装接口,包装分别有大、小。要求杯子只能用小包装,瓶子只能用大包装等……
package com.designpattern.abstractfactory;
public interface Package {
public void getPackageSize();
}
package com.designpattern.abstractfactory;
public class BigPackage implements Package {
@Override
public void getPackageSize() {
// TODO Auto-generated method stub
System.err.println("BigPackage");
}
}
package com.designpattern.abstractfactory;
public class SmallPackage implements Package {
@Override
public void getPackageSize() {
// TODO Auto-generated method stub
System.err.println("smallPackage");
}
}
package com.designpattern.abstractfactory;
public class FactoryBottle implements FactoryIntf {
@Override
public Container getContainer() {
// TODO Auto-generated method stub
return new Bottle();
}
@Override
public Package getPackage() {
// TODO Auto-generated method stub
return new BigPackage();
}
}
package com.designpattern.abstractfactory;
public class FactoryCup implements FactoryIntf {
@Override
public Container getContainer() {
// TODO Auto-generated method stub
return new Cup();
}
@Override
public Package getPackage() {
// TODO Auto-generated method stub
return new SmallPackage();
}
}
package com.designpattern.abstractfactory;
public class TestMain {
public static void main(String[] args) {
FactoryIntf factoryIntf = new FactoryBottle();
factoryIntf.getContainer().getName();
factoryIntf.getPackage().getPackageSize();
}
}
运行结果:
bottle name:bottle
BigPackage
在该基础之上增加一种包装:中,要求can要用中包装
package com.designpattern.abstractfactory;
public class MidPackage implements Package {
@Override
public void getPackageSize() {
// TODO Auto-generated method stub
System.err.println("MidPackage");
}
}
package com.designpattern.abstractfactory;
public class FactoryCan implements FactoryIntf {
@Override
public Container getContainer() {
// TODO Auto-generated method stub
return new Can();
}
@Override
public Package getPackage() {
// TODO Auto-generated method stub
return new MidPackage();
}
}