抽象工厂的引入
我们之前学过工厂模式,现在又来了一个抽象工厂模式,我们可以会觉得有些迷糊,抽象工厂是什么,和工厂模式又有什么区别呢?假想我们是一家的电脑组装工厂,生产的产品有笔记本和台式电脑,Cpu供应商又有Intel和Amd两家,Gpu又有Amd和Nvidia,还有主板和内存,硬盘等等。产品的组合是自由的,产品类型和供应商的组合又是不限的,但接口又要保持稳定,如果使用工厂模式我们会怎么写呢?按照我们的逻辑我们会创建一个接口,为每个产品都创建一个子类,这样才能实现产品的自定义,但我们的产品那么多,如果这样去实现,就需要我们反复去创建子类,这样效率是不是太低了,耦合度是不是太高了呢?一但要修改一部分的信息,全部都要推导重来,实在太可怕了。
但如果我们这样写,把cpu,gpu等信息都独立出来,变成一个独立的接口,我们的工厂父接口只要实现这些子接口的必要方法,就可以轻松把全部的信息组合完毕,而一旦cpu,gpu这些信息改变,不至于影响不到整个系统,这样系统的拓展能力是不是更强了,而这种思想就是抽象工厂模式。
抽象工厂模式最大的不同是让工厂变成一个超级工厂,对外隐藏内部的的细节,对内,在工厂的内部在划分多个厂区,每一个厂区相对独立,互不影响。从外面看只有一个工厂,但工厂实际的拓展能力却是Max。
![](https://img-blog.csdnimg.cn/img_convert/97dd0df63ae4f25e4826a28708c9d925.png)
啥都能生产
抽象工厂的优缺点
抽象工厂更像一个超级工厂,让每一个对象成为工厂的工人为这个工厂勤勤勉勉的工作,它的优点多,比如更好的系统拓展性(符合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());
}
}
和工厂模式的对比
相同点 | 不同点 | |
工厂模式 |
|
|
抽象工厂模式 |