zoukankan      html  css  js  c++  java
  • 一天学习一个设计模式之抽象工厂模式与工厂方法模式的区别

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

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

      这个系统的产品有多于一个的产品族,而系统只选择消费其中某一族的产品。例如,组装电脑是用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);
        }
    }
    

      

  • 相关阅读:
    Java的审计项目导入---基于现有的微服务项目上再加个xmsj
    vo中对date格式的时间格式的处理,方便到前台展示
    Java的Maven项目的导入
    [2020-05]测试短信发送记录
    那些年总是记不住的前端写法!
    【HTML+CSS】比较清淡的一个表格。
    C# 里这么写 busiDate.replace('-', ' ').trim(),可以把2020-04-01转为 20200401;java里这么些只能转为2020 04 01……
    radType条件没有用?
    我的程序里面出现了下面的警告:Unreachable code请问是什么原因?该怎么解决呢?
    ubuntu18.04安装Charles及问题
  • 原文地址:https://www.cnblogs.com/gousheng107/p/7943883.html
Copyright © 2011-2022 走看看