提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
模式结构
1.AbstractFactory:抽象工厂(声明了一组用于创建对象的方法, 注意是 一组。)
2.ConcreteFactory:具体工厂(它实现了在抽象工厂中声明的创建对象的方法,生成一组具体对象。)
3.AbstractProduct:抽象产品
4.Product:具体产品
UML:
与工厂方法最大的不同点
抽象工厂中每个工厂可以创建多种类的产品;而工厂方法每个工厂只能创建一类。
使用步骤
1.创建抽象工厂类
//抽象工厂接口
public abstract class AbstractCreator {
public abstract AbstractProduct ManufactureContainer();
public abstract AbstractProduct ManufactureMould();
}
2.创建抽象产品族类
//抽象产品族类
public abstract class AbstractProduct {
//所有产品类的公共业务方法
public void methodSame() {
//公共方法的实现
}
//声明抽象业务方法
public abstract void methodDiff();
}
3.创建抽象产品类
//模块产品抽象类
public abstract class MouldProduct extends AbstractProduct{
@Override
public abstract void methodDiff();
}
//容器产品抽象类
public abstract class ContainerProduct extends AbstractProduct {
@Override
public abstract void methodDiff();
}
- 创建具体产品类(继承抽象产品类)
//模块产品A
public class MouldProductA extends MouldProduct {
@Override
public void methodDiff() {
System.out.println("生产出了模块产品A");
}
}
//模块产品B
public class MouldProductB extends MouldProduct {
@Override
public void methodDiff() {
System.out.println("生产出了模块产品B");
}
}
//容器产品A
public class ContainerProductA extends ContainerProduct {
@Override
public void methodDiff() {
System.out.println("生产出了容器产品A");
}
}
//容器产品B
public class ContainerProductB extends ContainerProduct {
@Override
public void methodDiff() {
System.out.println("生产出了容器产品B");
}
}
5.创建具体工厂类(继承抽象工厂类)
//具体工厂A
public class FactoryA extends AbstractCreator{
@Override
public AbstractProduct ManufactureContainer() {
return new ContainerProductA();
}
@Override
public AbstractProduct ManufactureMould() {
return new MouldProductA();
}
}
//具体工厂B
public class FactoryB extends AbstractCreator {
@Override
public AbstractProduct ManufactureContainer() {
return new ContainerProductB();
}
@Override
public AbstractProduct ManufactureMould() {
return new MouldProductB();
}
}
6.客户端通过实例化具体的工厂类
//生产工作流程
public class AbstractFactoryPattern {
public static void main(String[] args){
FactoryA mFactoryA = new FactoryA();
FactoryB mFactoryB = new FactoryB();
//A厂当地客户需要容器产品A
mFactoryA.ManufactureContainer().methodDiff();
//A厂当地客户需要模具产品A
mFactoryA.ManufactureMould().methodDiff();
//B厂当地客户需要容器产品B
mFactoryB.ManufactureContainer().methodDiff();
//B厂当地客户需要模具产品B
mFactoryB.ManufactureMould().methodDiff();
}
}
优点
-降低耦合
可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展;
-更符合开-闭原则
新增一种产品类时,只需要增加相应的具体产品类和相应的工厂子类即可
-符合单一职责原则
每个具体工厂类只负责创建对应的产品
-不使用静态工厂方法,可以形成基于继承的等级结构。
缺点
-抽象工厂模式很难支持新种类产品的变化
这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这样也就违背了“开发——封闭”原则。
应用场景
1.一个系统不要求依赖产品类实例如何被创建、组合和表达的表达,这点也是所有工厂模式应用的前提。
2.这个系统有多个系列产品,而系统中只消费其中某一系列产品
3.系统要求提供一个产品类的库,所有产品以同样的接口出现,客户端不需要依赖具体实现。
网友评论