抽象工厂

2019-01-25  本文已影响0人  熊猫派

提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。

模式结构

1.AbstractFactory:抽象工厂(声明了一组用于创建对象的方法, 注意是 一组。)
2.ConcreteFactory:具体工厂(它实现了在抽象工厂中声明的创建对象的方法,生成一组具体对象。)
3.AbstractProduct:抽象产品
4.Product:具体产品
UML:

AbatractFactory.jpg

与工厂方法最大的不同点

抽象工厂中每个工厂可以创建多种类的产品;而工厂方法每个工厂只能创建一类。

使用步骤

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();
}
  1. 创建具体产品类(继承抽象产品类)
//模块产品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.系统要求提供一个产品类的库,所有产品以同样的接口出现,客户端不需要依赖具体实现。

上一篇 下一篇

猜你喜欢

热点阅读