设计模式-抽象工厂模式

抽象工厂可以在工厂方法模式上来理解
 
工厂方法模式是对简单工厂的进一步优化
首先,简单工厂模式内部的if或者case语句是不满足开放-封闭原则的
所以对简单工厂模式进一步优化,出现了工厂方法模式。
工厂方法模式将工厂抽象,实例化出不同的工厂,使得满足了开放-封闭原则
 
抽象工厂是在工厂方法模式上的又一部增强
工厂方法模式解决了同一类型物品实例化的问题,而抽象工厂解决了不同类型物品实例化的问题
 
按照工厂方法卖车的例子来说 client在需要汽车时,根据需要的型号找到对应的工厂来获取汽车。
不同类型的汽车都属于汽车类型。
此时如果又需要轮船了怎么办?
这时抽象工厂就出现了,相当于每个工厂既能生产汽车,又能生成轮船

 

 

 
那么之前工厂方法模式的例子中的工厂抽象类就要增加生成轮船的方法
//定义工厂抽象类
abstract class Factory{
    //能生产汽车
    public abstract Car getCar();
    //也能生产轮船
    public abstract Car getShip();
}

 

增加轮船的抽象类

//定义轮船的抽象类
abstract class Ship{
    public abstract void getType();
}

 

定义三种轮船

复制代码
//定义三种轮船
class ShipA extends Ship{
    @Override
    public void getType() {
        System.out.println("A型号轮船");
    }
}
class ShipB extends Ship{
    @Override
    public void getType() {
        System.out.println("B型号轮船");
    }
}
class ShipC extends Ship{
    @Override
    public void getType() {
        System.out.println("C型号轮船");
    }
}
复制代码

 

三种工厂还要增加获取轮船的方法

复制代码
//定义三种工厂
class FactoryA extends Factory{
    @Override
    public Car getCar() {
        return new CarA();
    }
    
    @Override
    public Car getShip() {
        return new ShipA();
    }
}
class FactoryB extends Factory{
    @Override
    public Car getCar() {
        return new CarB();
    }
    
    @Override
    public Car getShip() {
        return new ShipB();
    }
}
class FactoryC extends Factory{
    @Override
    public Car getCar() {
        return new CarC();
    }
    
    @Override
    public Car getShip() {
        return new ShipC();
    }
}
复制代码

 

测试

复制代码
public class AbstractFactoryTest {
    public static void main(String[] args) {
        //需要汽车
        Factory factoryB = new FactoryB();
        Car car = factoryB.getCar();
        car.getType();
        
        //需要轮船
        Factory factoryC = new FactoryC();
       Ship ship = factoryC.getShip();
       ship.getType();
    }
}
复制代码

 

在之前只需要生产汽车的时候,工厂方法模式就很好的解决了问题,
之后增加了需求,也需要轮船了,那么此时工厂既能生产汽车,也能生产轮船
就升级为抽象工厂模式,解决了不同族类型的问题

汽车是一个族,轮船是一个族,汽车和轮船不是同一个族

 

 
工厂方法解决了同族商品不同型号的问题
抽象工厂解决了不同族商品不同型号的问题

posted @   知识海洋中的浮萍  阅读(132)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示