📜  抽象工厂模式(1)

📅  最后修改于: 2023-12-03 15:10:06.779000             🧑  作者: Mango

抽象工厂模式

简介

抽象工厂模式是一种创建型设计模式,它提供了一种封装一组工厂方法(即“抽象工厂”)的方式,用于创建一些相关或相互依赖对象的家族,而无需指定实际实现类。

适用情况
  1. 当有多个抽象产品类时,且工厂只负责创建同一族中的产品对象,这时可以使用抽象工厂模式。

  2. 当要求一个系统有独立于它的产品的多个系列时,可以使用抽象工厂模式。

  3. 当一个对象族的产品并多余一个抽象类时,使用抽象工厂模式。

  4. 当类的可扩展性必须要考虑时,应当使用抽象工厂模式

UML类图

抽象工厂模式UML类图

示例代码
定义抽象产品接口
// 定义手机产品接口
public interface Phone {
    String getBrand();    // 获取手机品牌
    void call(String number);    // 打电话
}

// 定义电视产品接口
public interface TV {
    String getBrand();    // 获取电视品牌
    void play(String channel);    // 播放频道
}
定义具体产品类
// 小米手机
public class XiaomiPhone implements Phone {
    @Override
    public String getBrand() {
        return "小米";
    }

    @Override
    public void call(String number) {
        System.out.println("使用小米手机拨打电话:" + number);
    }
}

// 小米电视
public class XiaomiTV implements TV {
    @Override
    public String getBrand() {
        return "小米";
    }

    @Override
    public void play(String channel) {
        System.out.println("使用小米电视播放频道:" + channel);
    }
}

// 华为手机
public class HuaweiPhone implements Phone {
    @Override
    public String getBrand() {
        return "华为";
    }

    @Override
    public void call(String number) {
        System.out.println("使用华为手机拨打电话:" + number);
    }
}

// 华为电视
public class HuaweiTV implements TV {
    @Override
    public String getBrand() {
        return "华为";
    }

    @Override
    public void play(String channel) {
        System.out.println("使用华为电视播放频道:" + channel);
    }
}
定义抽象工厂
public interface ProductFactory {
    Phone createPhone();    // 创建手机
    TV createTV();    // 创建电视
}
定义具体工厂
// 小米产品工厂
public class XiaomiFactory implements ProductFactory {
    @Override
    public Phone createPhone() {
        return new XiaomiPhone();
    }

    @Override
    public TV createTV() {
        return new XiaomiTV();
    }
}

// 华为产品工厂
public class HuaweiFactory implements ProductFactory {
    @Override
    public Phone createPhone() {
        return new HuaweiPhone();
    }

    @Override
    public TV createTV() {
        return new HuaweiTV();
    }
}
测试代码
public class Test {
    public static void main(String[] args) {
        ProductFactory xiaomiFactory = new XiaomiFactory();    // 创建小米产品工厂
        Phone xiaomiPhone = xiaomiFactory.createPhone();    // 创建小米手机
        TV xiaomiTV = xiaomiFactory.createTV();    // 创建小米电视

        ProductFactory huaweiFactory = new HuaweiFactory();    // 创建华为产品工厂
        Phone huaweiPhone = huaweiFactory.createPhone();    // 创建华为手机
        TV huaweiTV = huaweiFactory.createTV();    // 创建华为电视

        xiaomiPhone.call("123456");
        xiaomiTV.play("CCTV-1");

        huaweiPhone.call("7890");
        huaweiTV.play("CCTV-2");
    }
}
输出结果
使用小米手机拨打电话:123456
使用小米电视播放频道:CCTV-1
使用华为手机拨打电话:7890
使用华为电视播放频道:CCTV-2