设计模式篇之抽象工厂模式

抽象工厂的引入

我们之前学过工厂模式,现在又来了一个抽象工厂模式,我们可以会觉得有些迷糊,抽象工厂是什么,和工厂模式又有什么区别呢?假想我们是一家的电脑组装工厂,生产的产品有笔记本和台式电脑,Cpu供应商又有Intel和Amd两家,Gpu又有Amd和Nvidia,还有主板和内存,硬盘等等。产品的组合是自由的,产品类型和供应商的组合又是不限的,但接口又要保持稳定,如果使用工厂模式我们会怎么写呢?按照我们的逻辑我们会创建一个接口,为每个产品都创建一个子类,这样才能实现产品的自定义,但我们的产品那么多,如果这样去实现,就需要我们反复去创建子类,这样效率是不是太低了,耦合度是不是太高了呢?一但要修改一部分的信息,全部都要推导重来,实在太可怕了。

但如果我们这样写,把cpu,gpu等信息都独立出来,变成一个独立的接口,我们的工厂父接口只要实现这些子接口的必要方法,就可以轻松把全部的信息组合完毕,而一旦cpu,gpu这些信息改变,不至于影响不到整个系统,这样系统的拓展能力是不是更强了,而这种思想就是抽象工厂模式。

抽象工厂模式最大的不同是让工厂变成一个超级工厂,对外隐藏内部的的细节,对内,在工厂的内部在划分多个厂区,每一个厂区相对独立,互不影响。从外面看只有一个工厂,但工厂实际的拓展能力却是Max。

啥都能生产

抽象工厂的优缺点

抽象工厂更像一个超级工厂,让每一个对象成为工厂的工人为这个工厂勤勤勉勉的工作,它的优点多,比如更好的系统拓展性(符合OCP原则),更高的开发效率,可以轻松实现一个产品系列的创建,但缺点也是有的,系统复杂性毫无疑问地提高了,顶层的父接口修改成本更高了,如上面的例子,工厂想再生产手机,那么修改的成本是极具攀升的,必须为每一个产品子接口在增加手机的方法,这样做就太酸爽了,根本做不到,当然也没有人这么做。

案例

computer

public interface ComputerFactory {
      GPU setGpu(GPU gpu);
      Cpu setCpu(Cpu cpu);


}
public class DesktopFactory implements ComputerFactory{
    GPU gpu;
    Cpu cpu;
    @Override
    public GPU setGpu(GPU gpu) {
        this.gpu=gpu;
        return null;
    }

    @Override
    public Cpu setCpu(Cpu cpu) {
        this.cpu=cpu;
        return null;
    }
}
public class LaptopFactory implements ComputerFactory {


    @Override
    public GPU setGpu(GPU gpu) {
        return null;
    }

    @Override
    public Cpu setCpu(Cpu cpu) {
        return null;
    }
}

cpu部分

public class AmdCpuFactory implements  CpuFactory{
    @Override
    public Cpu getCpuInfo() {
        return null;
    }

    @Override
    public Cpu setCpuInfo(String name,Double price) {
        Cpu cpu=new Cpu();
        cpu.setName(name);
        cpu.setPrice(1000d);
        return cpu;
    }
}
public class IntelCpuFactory implements  CpuFactory{
    Cpu cpu;
    @Override
    public Cpu getCpuInfo() {
        return null;
    }

    @Override
    public Cpu setCpuInfo(String name,Double price) {
        cpu=new Cpu();
        cpu.setName(name);
        cpu.setPrice(price);
        return cpu;
    }
}

GPU部分

public class NvidiaGpuFactory implements GpuFactory{
    GPU gpu;
    @Override
    public GPU getGpu() {
        return null;
    }

    @Override
    public GPU setGpuInfo(String name, Double price) {
        gpu= new GPU();
        gpu.setName(name);
        gpu.setPrice(2700d);
        return gpu;

    }
}
public class AmdGpuFactory implements GpuFactory{

    @Override
    public GPU getGpu() {
        return null;
    }

    @Override
    public GPU setGpuInfo(String name, Double price) {
        GPU gpu = new GPU();
        gpu.setName(name);
        gpu.setPrice(2700d);
        return gpu;

    }
}

实体类

public class Computer {
    GPU gpu;
    Cpu cpu;

    public GPU getGpu() {
        return gpu;
    }

    public void setGpu(GPU gpu) {
        this.gpu = gpu;
    }

    public Cpu getCpu() {
        return cpu;
    }

    public void setCpu(Cpu cpu) {
        this.cpu = cpu;
    }
}
public class Cpu {
    private String name;
    private Double price;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "CpuFactory{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}
public class GPU {
    private Double price;
    private String name;

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


}

主启动类

public class App {
    public static void main(String[] args) {

        ComputerFactory computerFactory = new DesktopFactory();
        Computer computer = new Computer();
        CpuFactory cpuFactory = new AmdCpuFactory();
        computer.cpu = cpuFactory.setCpuInfo("AMD Ryzen 5 3600",1199d);
        GpuFactory gpuFactory=new NvidiaGpuFactory();
        computer.gpu = gpuFactory.setGpuInfo("RTX3060",2184d);
        computerFactory.setCpu(cpuFactory.getCpuInfo());
        computer.setGpu(gpuFactory.getGpu());


    }
}

和工厂模式的对比

相同点

不同点

工厂模式

  1. 都是接口继承的方法,对外暴露接口,隐藏内部细节,只返回一个抽象对象

  1. 都符合OCP原理

  1. 抽象工厂模式是解决产品族的一系列不同种类产品创建再组合问题,工厂模式是解决一类产品创建问题

  1. 工厂模式拓展简单,但产品创建重复繁琐

  1. 抽象工厂产品族创建组合效率高,但产品族拓展困难

抽象工厂模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值