创建型模式——抽象工厂模式

一、介绍

很显然,简单工厂模式和工厂方法模式都只能生产一类的产品,除了生产手机,如果还需要生产手表,简单工厂模式和工厂方法模式就显得不是很优雅,只能复制代码了。因此就出现了抽象工厂模式,抽象工厂模式通过在抽象工厂中增加创建产品的接口,并在具体子工厂中实现新增产品的创建即可。

二、案例

这次采用模拟手机、智能手表制造举例说明:

  • 手机制造标准
/**
 * 手机制造标准
 *
 * @author zhangxs
 **/
public interface Phone {
    void make();
}
  • 苹果手机具体制造实现
/**
 * 苹果手机
 *
 * @author zhangxs
 **/
public class ApplePhone implements Phone {
    public ApplePhone() {
        this.make();
    }

    @Override
    public void make() {
        System.out.println("已制造苹果手机...");
    }
}
  • 华为手机具体制造实现
/**
 * 华为手机
 *
 * @author zhangxs
 **/
public class HuaweiPhone implements Phone {
    public HuaweiPhone() {
        this.make();
    }

    @Override
    public void make() {
        System.out.println("已制造华为手机...");
    }
}
  • 小米手机具体制造实现
/**
 * 小米手机
 *
 * @author zhangxs
 **/
public class XiaomiPhone implements Phone {
    public XiaomiPhone() {
        this.make();
    }

    @Override
    public void make() {
        System.out.println("已制造小米手机...");
    }
}
  • 智能手表制造标准
/**
 * 智能手表制造标准
 *
 * @author zhangxs
 **/
public interface Watch {
    void make();
}
  • 苹果智能手表具体制造实现
/**
 * 苹果智能手表
 *
 * @author zhangxs
 **/
public class AppleWatch implements Watch {
    public AppleWatch() {
        this.make();
    }

    @Override
    public void make() {
        System.out.println("已制造苹果智能手表...");
    }
}
  • 华为智能手表具体制造实现
/**
 * 华为智能手表
 *
 * @author zhangxs
 **/
public class HuaweiWatch implements Watch {
    public HuaweiWatch() {
        this.make();
    }

    @Override
    public void make() {
        System.out.println("已制造华为智能手表...");
    }
}
  • 小米智能手表具体制造实现
/**
 * 小米智能手表
 *
 * @author zhangxs
 **/
public class XiaomiWatch implements Watch {
    public XiaomiWatch() {
        this.make();
    }

    @Override
    public void make() {
        System.out.println("已制造小米智能手表...");
    }
}
  • 抽象工厂
/**
 * 抽象工厂
 *
 * @author zhangxs
 **/
public interface AbstractFactory {
    Phone makePhone();

    Watch makeWatch();
}
  • 苹果产品制造工厂
/**
 * 苹果产品代工厂
 *
 * @author zhangxs
 **/
public class AppleFactory implements AbstractFactory {
    @Override
    public Phone makePhone() {
        return new ApplePhone();
    }

    @Override
    public Watch makeWatch() {
        return new AppleWatch();
    }
}
  • 华为产品制造工厂
/**
 * 华为产品代工厂
 *
 * @author zhangxs
 **/
public class HuaweiFactory implements AbstractFactory {
    @Override
    public Phone makePhone() {
        return new HuaweiPhone();
    }

    @Override
    public Watch makeWatch() {
        return new HuaweiWatch();
    }
}
  • 小米产品制造工厂
/**
 * 小米产品代工厂
 *
 * @author zhangxs
 **/
public class XiaomiFactory implements AbstractFactory {
    @Override
    public Phone makePhone() {
        return new XiaomiPhone();
    }

    @Override
    public Watch makeWatch() {
        return new XiaomiWatch();
    }
}
  • 测试
/**
 * 测试
 *
 * @author zhangxs
 **/
public class Test {
    public static void main(String[] args) {
        AbstractFactory appleFactory = new AppleFactory();
        appleFactory.makePhone();
        appleFactory.makeWatch();
        AbstractFactory huaweiFactory = new HuaweiFactory();
        huaweiFactory.makePhone();
        huaweiFactory.makeWatch();
        AbstractFactory xiaomiFactory = new XiaomiFactory();
        xiaomiFactory.makePhone();
        xiaomiFactory.makeWatch();
    }
}

三、总结

  • 优点
    1、抽象工厂模式包含了工厂方法模式的优点。
    2、可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
    3、当需要产品族时,抽象工厂可以保证客户端始终只使用同一个产品的产品组。
    4、抽象工厂增强了程序的可扩展性,当增加一个新的产品族时,不需要修改原代码,满足开闭原则。
  • 缺点
    1、当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。增加了系统的抽象性和理解难度。
  • 适用场景
    1、系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
    2、系统一次只可能消费其中某一族产品,即同族的产品一起使用。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值