2021-07-06 抽象工厂模式

2021-11-11  本文已影响0人  Denholm

概念

是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。

结构

抽象工厂模式的主要角色如下:

public abstract class Coffee {

    public abstract String getName();

    protected void addSugar() {
        System.out.println("加糖");
    }

    protected void addMilk() {
        System.out.println("加奶");
    }

}
public class AmericaCoffee extends Coffee {

    @Override
    public String getName() {
        return "美国咖啡";
    }

}
public class LatteCoffee extends Coffee {

    @Override
    public String getName() {
        return "拿铁咖啡";
    }

}
public abstract class Dessert {

    public abstract void show();

}
public class Tiramisu extends Dessert {

    @Override
    public void show() {
        System.out.println("提拉米苏");
    }

}
public class MatchaMousse extends Dessert {

    @Override
    public void show() {
        System.out.println("抹茶慕斯");
    }

}
/**
 * 甜品工厂,生产甜品和咖啡
 */
public interface DessertFactory {

    // 生产咖啡
    Coffee createCoffee();

    // 生产甜品
    Dessert createDessert();

}
public class AmericaDessertFactory implements DessertFactory {

    @Override
    public Coffee createCoffee() {
        return new AmericaCoffee();
    }

    @Override
    public Dessert createDessert() {
        return new MatchaMousse();
    }

}
public class ItalyDessertFactory implements DessertFactory {

    @Override
    public Coffee createCoffee() {
        return new LatteCoffee();
    }

    @Override
    public Dessert createDessert() {
        return new Tiramisu();
    }

}
public class Client {

    public static void main(String[] args) {
//        DessertFactory factory = new AmericaDessertFactory();
        DessertFactory factory = new ItalyDessertFactory();
        Coffee coffee = factory.createCoffee();
        Dessert dessert = factory.createDessert();
        System.out.println(coffee.getName());
        dessert.show();
    }

}

如果要加同一个产品族的话,只需要再加一个对应的工厂类即可,不需要修改其他的类。

优缺点

优点:

当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点:

当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。

使用场景

上一篇 下一篇

猜你喜欢

热点阅读