Preview
Skip to content
CodingDiary
返回

设计模式之创建型设计模式-抽象工厂模式

编辑页面
导读

简单工厂生产单一产品,工厂方法还是单一产品,抽象工厂才是「产品族」!本文用科技公司卖手机+笔记本+耳机的场景讲解:小米、华为、苹果三家公司,每家都有自己的产品线。TechFactory 抽象工厂定义 sellPhone/sellLaptop/sellEarPhone 三个方法,子类各自实现。附 Spring AbstractBeanFactory 源码分析。

1. 模式简介

提供一个创建一系列相关或者相互依赖对象的接口,无须指定具体的类,属于创建型设计模式

2. 示例代码

// 手机产品抽象类
public abstract class Phone {
    /**
     * 描述
     */
    public abstract void describe();
}

// 笔记本产品抽象类
public abstract class Laptop {
    /**
     * 描述
     */
    public abstract void describe();
}

// 耳机产品抽象类
public abstract class EarPhone {
    /**
     * 描述
     */
    public abstract void describe();
}
// 科技公司抽象工厂类
public abstract class TechFactory {
    /**
     * 卖手机
     *
     * @return 手机
     */
    public abstract Phone sellPhone();

    /**
     * 卖笔记本
     *
     * @return 笔记本
     */
    public abstract Laptop sellLaptop();

    /**
     * 卖耳机
     *
     * @return 耳机
     */
    public abstract EarPhone sellEarPhone();
}

// 小米品牌小米手机具体实现
public class MiPhone extends Phone {
    /**
     * 描述
     */
    @Override
    public void describe() {
        System.out.println("小米手机");
    }
}

// 小米品牌小米笔记本具体实现
public class MiLaptop extends Laptop{
    /**
     * 描述
     */
    @Override
    public void describe() {
        System.out.println("小米笔记本");
    }
}

// 小米品牌小米耳机具体实现
public class MiEarPhone extends EarPhone {
    /**
     * 描述
     */
    @Override
    public void describe() {
        System.out.println("小米耳机");
    }
}

// 小米公司工厂具体实现
public class MiTechCompany extends TechFactory {
    /**
     * 卖手机
     *
     * @return 手机
     */
    @Override
    public Phone sellPhone() {
        return new MiPhone();
    }

    /**
     * 卖笔记本
     *
     * @return 笔记本
     */
    @Override
    public Laptop sellLaptop() {
        return new MiLaptop();
    }

    /**
     * 卖耳机
     *
     * @return 耳机
     */
    @Override
    public EarPhone sellEarPhone() {
        return new MiEarPhone();
    }
}

// 华为品牌华为手机具体实现
public class HuaweiPhone extends Phone {
    /**
     * 描述
     */
    @Override
    public void describe() {
        System.out.println("华为手机");
    }
}

// 华为品牌华为笔记本具体实现
public class HuaweiLaptop extends Laptop{
    /**
     * 描述
     */
    @Override
    public void describe() {
        System.out.println("华为笔记本");
    }
}

// 华为品牌华为耳机具体实现
public class HuaweiEarPhone extends EarPhone {
    /**
     * 描述
     */
    @Override
    public void describe() {
        System.out.println("华为耳机");
    }
}

// 华为公司工厂具体实现
public class HuaweiTechCompany extends TechFactory {
    /**
     * 卖手机
     *
     * @return 手机
     */
    @Override
    public Phone sellPhone() {
        return new HuaweiPhone();
    }

    /**
     * 卖笔记本
     *
     * @return 笔记本
     */
    @Override
    public Laptop sellLaptop() {
        return new HuaweiLaptop();
    }

    /**
     * 卖耳机
     *
     * @return 耳机
     */
    @Override
    public EarPhone sellEarPhone() {
        return new HuaweiEarPhone();
    }
}

// 苹果品牌苹果手机具体实现
public class IPhone extends Phone {
    /**
     * 描述
     */
    @Override
    public void describe() {
        System.out.println("IPhone");
    }
}

// 苹果品牌苹果笔记本具体实现
public class MacBookPro extends Laptop{
    /**
     * 描述
     */
    @Override
    public void describe() {
        System.out.println("MacBookPro");
    }
}

// 苹果品牌苹果耳机具体实现
public class AirPod extends EarPhone {
    /**
     * 描述
     */
    @Override
    public void describe() {
        System.out.println("AirPod");
    }
}

// 苹果公司工厂具体实现
public class AppleTechCompany extends TechFactory {
    /**
     * 卖手机
     *
     * @return 手机
     */
    @Override
    public Phone sellPhone() {
        return new IPhone();
    }

    /**
     * 卖笔记本
     *
     * @return 笔记本
     */
    @Override
    public Laptop sellLaptop() {
        return new MacBookPro();
    }

    /**
     * 卖耳机
     *
     * @return 耳机
     */
    @Override
    public EarPhone sellEarPhone() {
        return new AirPod();
    }
}

3. UML图例

抽象工厂模式UML图

4. 应用

// Spring 源码
// AbstractBeanFactory -> AbstractAutowireCapableBeanFactory / DefaultListableBeanFactory / XmlBeanFactory

5. 场景

6. 优缺点

优点: 具体产品在应用层代码隔离,不关心创建细节;将一系列的产品族对象统一在一起创建

缺点: 添加一种新的产品的时候,需要在工厂接口及其工厂子类都添加实现,不符合开闭原则;增加了系统的抽象性和理解难度

7. 完整代码地址

https://github.com/xkcoding/design-pattern/tree/master/src/main/java/com/xkcoding/design/pattern/creational/abstractfactory


编辑页面
分享到:

上一篇
设计模式之创建型设计模式-单例模式
下一篇
使用JustAuth集成企业微信