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

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

目的

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

优点

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

缺点

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

实现方式

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

abstract factory的例子

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

1、abstract factory(抽象工厂模式)_第1张图片
image.png

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

代码

代码分析

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


1、abstract factory(抽象工厂模式)_第2张图片
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(抽象工厂模式))