抽象工厂模式(Abstract Factory)

抽象工厂模式(Abstract Factory),提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。

  便于理解的说,工厂方法模式创建一种对象,抽象工厂模式创建一类(多种)对象。

 

不同工厂生产果汁和水果派,会采用不同水果,得到的果汁和派也不一样。

1,定义果汁和派

public interface Juice {
    void show();
}
public interface Pie {
    void show();
}

2,假设有两个原材料,分别是苹果和香蕉,每种水果可以制作两种产品。

public class AppleJuice implements Juice {
    @Override
    public void show() {
        System.out.println("Apple juice");
    }
}
public class ApplePie implements Pie {

    @Override
    public void show() {
        System.out.println("Apple pie");
    }
}
public class BananaJuice implements Juice {
    @Override
    public void show() {
        System.out.println("Banana Juice");
    }
}
public class BananaPie implements Pie {
    @Override
    public void show() {
        System.out.println("Bnanana pie");
    }
}

3,定义抽象工厂,具有生产果汁和派的能力

public abstract class AbstractFactory {
    public abstract Juice createJuice();
    public abstract Pie createPie();
}

4,苹果工厂

public class AppleFactory extends AbstractFactory{

    @Override
    public Juice createJuice() {
        return new AppleJuice();
    }

    @Override
    public Pie createPie() {
        return new ApplePie();
    }
}

香蕉工厂

public class BananaFactory extends AbstractFactory {
    @Override
    public Juice createJuice() {
        return  new BananaJuice();
    }

    @Override
    public Pie createPie() {
        return new BananaPie();
    }
}

6,客户端获得苹果汁和苹果派

public class AbstractFactoryPattern {
    public static void main(String[] args) {
        AbstractFactory factory = new AppleFactory();
        //AbstractFactory factory = new ChocolateFactory();
        factory.createJuice().show();
        factory.createPie().show();
    }
}

7,控制台输出

Apple juice
Apple pie

Process finished with exit code 0

 

抽象工厂模式优点:

  如果想要加入巧克力系列,先建立巧克力汁类和巧克力派类,然后建立巧克力工厂,就可以在客户端获得巧克力系列产品了(如上图中注释代码),无需更改原有代码,完全符合开放封闭原则。

  对象的产生依赖抽象类,而不依赖具体的实现,完全符合依赖倒转原则。

缺点:

  如果想在原工厂中增加水果饼干产品,那么要增加饼干接口,苹果饼干类,香蕉饼干类, 还要更改抽象工厂,苹果工厂,香蕉工厂的代码,麻烦。

 

posted @ 2018-12-20 21:58  dioag  阅读(193)  评论(0编辑  收藏  举报