一天一个设计模式:抽象方法模式

为什么引入抽象工厂模式?

或者说抽象工厂模式与工厂方法模式的区别?

工厂方法模式针对的是一类产品的等级结构,而抽象工厂模式针对的是多个产品等级结构(一个产品族)。


引入概念:产品族与产品等级

产品族:指在不同的产品等级结构中,功能相关联的产品组成的家族。
产品等级:同类产品的不同产品区分。

 

抽象工厂的作用:

就是创建不同产品等级,但属于同一产品族的产品

 

那抽象工厂的定义:

创建不同产品等级,但属于同一产品族的产品的工厂的抽象。
那么具体的实现工厂就对应了不同的产品等级下的同一产品族的所有产品。

抽象工厂模式结构:

抽象工厂定义了一个产品族的生产功能,然后交由具体的产品工厂去生产。 

注:抽象工厂的接口不是随意堆砌的,而是相互关联或依赖的方法集成在一起的。

例子如下图:以电脑为例


优点:

    分离接口与实现
    使用抽象工厂来创建所需要的对象,客户端仅仅是面向接口来编程,客户端可以实现从产品中解耦。
    使切换产品族变得更容易
    因为一个具体的工厂实现代表一个产品族,仅替换实现工厂即可切换。


缺点:

    不易扩展
    产品族如果有新产品出现,就需要对抽象工厂进行修改,这会导致需要更新所有的工厂类。

 

实例:

 抽象工厂:

复制代码
public interface AbstractFactory {
    /**
     * 创建CPU对象
     * @return CPU对象
     */
    public Cpu createCpu();
    /**
     * 创建主板对象
     * @return 主板对象
     */
    public Mainboard createMainboard();
}
View Code
复制代码

英特尔工厂:

复制代码
public class IntelFactory implements AbstractFactory {

    @Override
    public Cpu createCpu() {
        // TODO Auto-generated method stub
        return new IntelCpu(755);
    }

    @Override
    public Mainboard createMainboard() {
        // TODO Auto-generated method stub
        return new IntelMainboard(755);
    }

}
View Code
复制代码

amd工厂:

复制代码
public class AmdFactory implements AbstractFactory {

    @Override
    public Cpu createCpu() {
        // TODO Auto-generated method stub
        return new IntelCpu(938);
    }

    @Override
    public Mainboard createMainboard() {
        // TODO Auto-generated method stub
        return new IntelMainboard(938);
    }

}
View Code
复制代码

装机人员:

复制代码
public class ComputerEngineer {
    /**
     * 定义组装机需要的CPU
     */
    private Cpu cpu = null;
    /**
     * 定义组装机需要的主板
     */
    private Mainboard mainboard = null;
    public void makeComputer(AbstractFactory af){
        /**
         * 组装机器的基本步骤
         */
        //1:首先准备好装机所需要的配件
        prepareHardwares(af);
        //2:组装机器
        //3:测试机器
        //4:交付客户
    }
    private void prepareHardwares(AbstractFactory af){
        //这里要去准备CPU和主板的具体实现,为了示例简单,这里只准备这两个
        //可是,装机工程师并不知道如何去创建,怎么办呢?
        
        //直接找相应的工厂获取
        this.cpu = af.createCpu();
        this.mainboard = af.createMainboard();
        
        //测试配件是否好用
        this.cpu.calculate();
        this.mainboard.installCPU();
    }
}
View Code
复制代码

测试代码:

复制代码
public class Client {
    public static void main(String[]args){
        //创建装机工程师对象
        ComputerEngineer cf = new ComputerEngineer();
        //客户选择并创建需要使用的产品对象
        AbstractFactory af = new IntelFactory();
        //告诉装机工程师自己选择的产品,让装机工程师组装电脑
        cf.makeComputer(af);
    }
}
View Code
复制代码

 

最后补充一句:

看到i7-9900k的售价,英特尔真是骗傻子钱多有恃无恐。干他妈的英特尔,amd加油!!!

 

参考链接:

https://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html

posted @   萌新啊萌新是我  阅读(191)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示