博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一天学习一个设计模式之抽象工厂模式与工厂方法模式的区别
阅读量:5037 次
发布时间:2019-06-12

本文共 3157 字,大约阅读时间需要 10 分钟。

  抽象工厂模式与工厂方法模式的最大区别在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构

  在什么情况下应当使用抽象工厂模式?

  这个系统的产品有多于一个的产品族,而系统只选择消费其中某一族的产品。例如,组装电脑是用Inter的产品族还是用AMD的产品族,当选择其中一个品牌后,再确定用这个品牌下的组件,CPU、主板、显卡等来组装一台电脑。这就取决于实施人员在组装的时候设置参数来决定使用哪一个品牌。

  同属于同一个产品族的产品是一起使用的,这一约束必须在系统的设计中体现出来。比如:Intel的产品是属于Intel产品族,而AMD的产品属于AMD产品族。将CPU和主板是这两个版本(产品族)拥有的产品,而抽象工厂有两个具体工厂实现类IntelFactory、AmdFactory负责分别创建Intel Cpu、Inter主版和AMDCPU和AMD主板。当用户需要组装电脑时,先需要选择是CPU和主板。当不使用抽象工厂可能会出现如下情况 :用户选择了Intel的CPU和AMD的主板。这两者插槽是不匹配的。这样就会出现问题。如果使用抽象工厂,那抽象工厂的具体实现类会帮你创建一个产品族中的一系列产品对象,如Intel工厂会创建IntelCpu和Intel主板,AMD工厂会创建AMDCPU和AMD主板。

其实抽象工厂就是起到了一定的约束作用,它所创建的都是同一个产品族中的一系列产品对象。防止出现上面例子中创建不同产品族中产品所带来的问题。

创建CPU:

public interface Cpu {     //计算方法     void calculate();}
public class IntelCpu implements Cpu {    //cpu的针脚数    private int pins=0;    public IntelCpu(int pins) {        this.pins = pins;    }    @Override    public void calculate() {        System.out.println("Interl CPU的针脚数:"+pins);    }}
public class AmdCpu implements Cpu {    private int pins=0;    public AmdCpu(int pins) {        this.pins = pins;    }    @Override    public void calculate() {        System.out.println("AMD CPU的针脚数:"+pins);    }}

创建主板

public interface Mainboard {    //安装CPU方法    void instalCpu();}
public class IntelMainboard implements Mainboard {    //cpu插槽的孔数    private int cpuHoles=0;    public IntelMainboard(int cpuHoles) {        this.cpuHoles = cpuHoles;    }    @Override    public void instalCpu() {        System.out.println("Intel主板的CPU插槽孔数是:"+cpuHoles);    }}
public class AmdMainboard implements Mainboard {        //cpu插槽的孔数        private int cpuHoles=0;        public AmdMainboard(int cpuHoles) {            this.cpuHoles = cpuHoles;        }        @Override        public void instalCpu() {            System.out.println("AMD主板的CPU插槽孔数是:"+cpuHoles);        }}

工厂: 

public interface AbstractFactory {    Cpu createCpu();    Mainboard createMainboard();}
public class AmdFactory implements AbstractFactory {    @Override    public Cpu createCpu() {        return new AmdCpu(938);    }    @Override    public Mainboard createMainboard() {        return new AmdMainboard(938);    }}
public class IntelFactory implements AbstractFactory {    @Override    public Cpu createCpu() {        return new IntelCpu(755);    }    @Override    public Mainboard createMainboard() {        return new IntelMainboard(755);    }}

工程师

public class Engineer {    //定义组装机需要的CPU    private Cpu cpu=null;    //定义组装需要的主板    private Mainboard mainboard=null;    //组装电脑    public void makeComputer(AbstractFactory af){        //组装机器的基本步骤        prepareHardwares(af);    }    private void prepareHardwares(AbstractFactory af) {        //直接找工厂获取        this.cpu=af.createCpu();        this.mainboard= af.createMainboard();        //测试配件是否可用        this.cpu.calculate();        this.mainboard.instalCPU();    }}

客户端

public class Client {    public static void main(String[] args) {        //创建装机工程师对象        Engineer engineer = new Engineer();        //客户选择并创建需要使用的产品对象        AbstractFactory af = new IntelFactory();        //告诉装机工程师自己选择的产品        engineer.makeComputer(af);    }}

  

转载于:https://www.cnblogs.com/gousheng107/p/7943883.html

你可能感兴趣的文章
立即执行函数
查看>>
第四次寒假作业
查看>>
USE_FUNC.txt
查看>>
分享一下 Eclipse 插件 PyDev 的安装
查看>>
(转)Python3之os模块
查看>>
hdu 4038 stone
查看>>
ASP.NET 显示项目之外的图片
查看>>
2011数字图书馆前沿问题高级研讨班-学习笔记1
查看>>
深度学习系列 Part(3)
查看>>
HDFS之HBase伪分布安装
查看>>
android 测试----Monkey
查看>>
static 关键字
查看>>
Vue 的基本认识
查看>>
最高的分数
查看>>
命令别名设置: alias, unalias
查看>>
1051. 复数乘法 (15)
查看>>
gcc相关
查看>>
tmp目录
查看>>
Codeforces Round #374 (Div. 2)
查看>>
6个出色的基于JQuery的Tab选项卡实例
查看>>