抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用于产品族的构建。抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。来源:百度百科

我们依然沿着上次简单工厂走下去。

实现

我们将创建 DrinksTaste 接口和实现这些接口的实体类。下一步是创建抽象工厂类 AbstractFactory。接着定义工厂类 TasteFactoryDrinksFactory
UML

Step 1

创建Drinks和Taste接口

public interface Drinks {
    void make();
}
public interface Taste {
    void fill();
}

创建接口的实体类

这里只举两个例子:Coffee.java、Birtter.java

public class Coffee implements Drinks {
    // 调用make方法
    public Coffee() {
        this.make();
    }

    @Override
    public void make() {
        System.out.println("泡一杯咖啡");
    }
}
public class Bitter implements Taste{
    // 调用fill方法
    public Bitter() {
        this.fill();
    }
    @Override
    public void fill() {
        System.out.println("苦的");
    }
}

Step 3

为两个接口(Drinks、Taste)创建抽象类来获取工厂。
AbstractFactory.java

public abstract class AbstractFactory {
    public abstract Drinks getDrinks (String drinks);
    public abstract Taste getTaste (String taste);
}

Step 4

创建扩展了 AbstractFactory 的工厂类,基于给定的信息生成实体类的对象。
DrinksFactory.java & TasteFactory.java

public class DrinksFactory extends AbstractFactory {
    // 使用getDrinks获取Drinks类型的对象
    @Override
    public Drinks getDrinks(String drinkType) {
        if(drinkType == null) {
            return null;
        } else if (drinkType.equalsIgnoreCase("Coffee")) {
            return new Coffee();
        } else if (drinkType.equalsIgnoreCase("Juice")) {
            return new Juice();
        }
        return null;
    }

    // 两个都必须要重写
    @Override
    public Taste getTaste(String taste) {
        return null;
    }
}
public class TasteFactory extends AbstractFactory{
    @Override
    public Drinks getDrinks(String drinks) {
        return null;
    }

    @Override
    public Taste getTaste(String tasteType) {
        if(tasteType == null) {
            return null;
        } else if(tasteType.equalsIgnoreCase("Sour")) {
            return new Sour();
        } else if (tasteType.equalsIgnoreCase("Bitter")) {
            return new Bitter();
        }
        return null;
    }
}

Step 5

执行程序

public class Test {
    public static void main(String[] args) {
        AbstractFactory drinkTest = new DrinksFactory();
        Drinks drink1 = drinkTest.getDrinks("Coffee"); // 获取Coffee对象
        Drinks drink2 = drinkTest.getDrinks("Juice"); // 获取Juice方法
        AbstractFactory tasteTest = new TasteFactory();
        Taste taste1 = tasteTest.getTaste("Bitter");
        Taste taste2 = tasteTest.getTaste("Sour");
    }
}

输出结果

ans

收获

何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
如何解决:在一个产品族里面,定义多个产品。
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值