美文网首页
1、abstract factory(抽象工厂模式)

1、abstract factory(抽象工厂模式)

作者: 我要扭开奥利奥 | 来源:发表于2019-05-12 22:54 被阅读0次

    抽象工厂主要是创建一个工厂的工厂。

    目的

    提供一个创建一系列相关或者互相依赖对象的接口,而无需指定他们具体的类。

    优点

    • 具体代码在应用层的隔离,无需关心创建的细节
    • 将产品统一到一起创建

    缺点

    • 难以支持新的铲平类别
    • 增加了系统的抽象性

    实现方式

    • 将工厂作为单件,每个产品系列中只需要一个虚拟工厂的实列,因此可以将工厂创建为一个Singleton。
    • 为每一个产品定义一个工厂方法。

    abstract factory的例子

    为了更好理解抽象工厂模式,需要先搞清楚产品等级和产品族的概念,举个粟子:手机有小米手机、华为手机,它们都是手机,这些具体的手机和抽象手机就构成了一个产品等级结构。同样的,路由器有小米路由器,华为路由器,这些具体的路由器和抽象路由器就构成了另外一个产品等级结构,实质上产品等级结构即产品的继承结构。小米手机位于手机产品等级结构中,小米路由器位于路由器的产品等级结构中,而小米手机和小米路由器都是小米公司生产的,就构成了一个产品族,同理,华为手机和华为路由器也构成了一个产品族 。划重点就是产品族中的产品都是由同一个工厂生产的,位于不同的产品等级结构

    image.png
    对比工厂方法,其针对的是产品等级结构,而抽象工厂是针对产品族。在二者的使用选择上,需要结合实际业务,对于产品等级数量相对固定的产品族,可以优先考虑抽象工厂模式,但是如果频繁变动,则不大适用,因为在现有的产品族中新增产品等级时,就需要修改产品族工厂,也就违背了开闭原则
    引用自吴渣渣

    代码

    代码分析

    一个abstract factory被XiaomiProductFactory和HuaweiProduct Factory两个工厂类实现。其实现方法和工厂方法一致。具体继承关系如下图:


    image.png

    代码实现

    ProductFactory

    /**
     * 抽象工厂类
     * 定义同一种类型的产品的生产
     */
    public interface ProductFactory {
        /**
         * 生产手机
         */
        PhoneProduct producePhone();
        /**
         * 生产电脑
         */
        ComputerProduct produceComputer();
    }
    

    XiaomiProductFactory

    public class XiaomiProductFactory implements ProductFactory {
        @Override
        public PhoneProduct producePhone(){
            System.out.println("生产小米手机");
            return new XiaomiPhone();
        }
        @Override
        public ComputerProduct produceComputer(){
            System.out.println("生产小米电脑");
            return new XiaomiComputer();
        }
    }
    

    HuaweiProductFactory

    public class HuaweiProductFactory implements ProductFactory{
        @Override
        public PhoneProduct producePhone(){
            System.out.println("生产华为手机");
            return new HuaweiPhone();
        }
        @Override
        public ComputerProduct produceComputer(){
            System.out.println("生产华为电脑");
            return new HuaweiComputer();
        }
    }
    

    抽象产品类如下
    PhoneProduct

    public interface PhoneProduct {
        void start();
        void powerOff();
        void call();
        void sendMessage();
    }
    

    ComputerProduct

    /**
     * 电脑接口
     */
    public interface ComputerProduct {
        void start();
        void powerOff();
        void code();
    }
    

    产品实现类如下:
    XiaomiPhone

    public class XiaomiPhone implements PhoneProduct {
        @Override
        public void start(){
            System.out.println("小米手机开机");
        }
        @Override
        public void powerOff(){
            System.out.println("小米手机关机");
        }
        @Override
        public void call(){
            System.out.println("小米手机打电话");
        }
        @Override
        public void sendMessage(){
            System.out.println("小米手机发送信息");
        }
    }
    

    XiaomiComputer

    public class XiaomiComputer implements ComputerProduct{
        @Override
        public void start(){
            System.out.println("小米电脑开机");
        }
        @Override
        public void powerOff(){
            System.out.println("小米电脑关机");
        }
        @Override
        public void code(){
            System.out.println("小米电脑写代码");
        }
    }
    
    

    HuaweiPhone

    public class HuaweiPhone implements PhoneProduct {
        @Override
        public void start(){
            System.out.println("华为手机开机");
        }
        @Override
        public void powerOff(){
            System.out.println("华为手机关机");
        }
        @Override
        public void call(){
            System.out.println("华为手机打电话");
        }
        @Override
        public void sendMessage(){
            System.out.println("华为手机发短信");
        }
    }
    

    HuaweiComputer

    public class HuaweiComputer implements ComputerProduct {
        @Override
        public void start(){
            System.out.println("华为电脑开机");
        }
        @Override
        public void powerOff(){
            System.out.println("华为电脑关机");
        }
        @Override
        public void code(){
            System.out.println("华为电脑写代码");
        }
    }
    

    相关文章

      网友评论

          本文标题:1、abstract factory(抽象工厂模式)

          本文链接:https://www.haomeiwen.com/subject/dmmhaqtx.html