前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一天一个设计模式:抽象方法模式

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

作者头像
用户1134788
发布2018-12-03 11:36:23
7860
发布2018-12-03 11:36:23
举报
文章被收录于专栏:栗霖积跬步之旅

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

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

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

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

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

抽象工厂的作用:

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

那抽象工厂的定义:

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

抽象工厂模式结构:

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

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

例子如下图:以电脑为例

优点:

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

缺点:

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

实例:

 抽象工厂:

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

英特尔工厂:

代码语言:javascript
复制
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);
    }

}

amd工厂:

代码语言:javascript
复制
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);
    }

}

装机人员:

代码语言:javascript
复制
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();
    }
}

测试代码:

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

最后补充一句:

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

参考链接:

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-10-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么引入抽象工厂模式?
  • 或者说抽象工厂模式与工厂方法模式的区别?
  • 引入概念:产品族与产品等级
  • 抽象工厂的作用:
  • 那抽象工厂的定义:
  • 抽象工厂模式结构:
  • 优点:
  • 缺点:
  • 实例:
  • 参考链接:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档