设计模式之抽象工厂模式(三)

基本定义

  • 抽象工厂模式提供一个接口,用户创建相关或者依赖对象的家族,而不需要明确指定具体类。
  • 抽象工厂允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际产出的具体产品是什么,这样一来客户可以从具体的产品关系中解耦。

模式结构

  1. AbstractFactory:抽象工厂。抽象工厂定义了一个接口,所有的具体工厂都必须实现此接口,这个接口包含了一组方法用来生产产品。
  2. ConcreteFactory:具体工厂。具体工厂是用于生产不同产品族。要创建一个产品,客户只需要使用其中一个工厂完全不需要实例化任何产品对象。
  3. AbstractProduct:抽象产品。这是一个产品家族,每一个具体工厂都能够生产一整组产品。
  4. Product:具体产品。
    在这里插入图片描述

模式实现

AbstractProductA 抽象产品类(电脑)

public interface PC {
    void playGame();
}

ConcreteProductA1 具体产品类(华为电脑)

@Slf4j
public class HuaweiPC implements PC {
    @Override
    public void playGame() {
      log.info("使用华为电脑玩DOTA");
    }
}

ConcreteProductA2 具体产品类(苹果电脑)

@Slf4j
public class ApplePC implements PC {
    @Override
    public void playGame() {
      log.info("使用苹果电脑玩国际象棋");
    }
}

AbstractProductB 抽象产品类(手机)

public interface Phone {
    void call(String receiver);
}

ConcreteProductB1 具体产品类(华为手机)

@Slf4j
public class HuaweiPhone implements Phone {
    @Override
    public void call(String receiver) {
        log.info("华为手机拨打{}电话", receiver);
    }
}

ConcreteProductB2 具体产品类(苹果手机)

public interface Phone {
    void call(String receiver);
}

AbstractFactory 抽象工厂类

public interface AbstractFactory {
    PC makePC();
    Phone makePhone();
}

ConcreteFactory 具体工厂类1(华为工厂)

public class HuaweiFactory implements AbstractFactory {

    @Override
    public PC makePC() {
        return new HuaweiPC();
    }

    @Override
    public Phone makePhone() {
        return new HuaweiPhone();
    }
}

ConcreteFactory 具体工厂类2 (苹果工厂)

public class AppleFactory implements AbstractFactory {

    @Override
    public PC makePC() {
        return new ApplePC();
    }

    @Override
    public Phone makePhone() {
        return new IPhone();
    }
}

测试类

public class Test {

    public static void main(String[] args) {
        AbstractFactory huaweiFactory = new HuaweiFactory();
        PC huaweiPC = huaweiFactory.makePC();
        huaweiPC.playGame();
        Phone huaweiPhone = huaweiFactory.makePhone();
        huaweiPhone.call("西施");

        AbstractFactory appleFactory = new AppleFactory();
        PC applePC = appleFactory.makePC();
        applePC.playGame();
        Phone iphone = appleFactory.makePhone();
        iphone.call("程咬金");
    }
}

输出结果

23:19:12.427 [main] INFO com.yanyuan.gof.build.abstractFactory.v2.HuaweiPC - 使用华为电脑玩DOTA
23:19:12.459 [main] INFO com.yanyuan.gof.build.abstractFactory.v2.HuaweiPhone - 华为手机拨打西施电话
23:19:12.465 [main] INFO com.yanyuan.gof.build.abstractFactory.v2.ApplePC - 使用苹果电脑玩国际象棋
23:19:12.466 [main] INFO com.yanyuan.gof.build.abstractFactory.v2.IPhone - iPhone手机拨打程咬金电话

总结

抽象工厂模式中主要的优点在于具体类的隔离,是的客户端不需要知道什么被创建了。其缺点在于增加新的产品族比较复杂,需要修改接口及其所有子类。

工厂模式和抽象工厂模式主要区别在于产品,产品种类单一,适合工厂模式。 抽象工厂模式适合用于创建多个产品种类,多个产品类型。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值