zoukankan      html  css  js  c++  java
  • 步步为营之——Abstract Factory 抽象工厂模式

    对于设计模式,我认为都是通过大量实践经验、前人的来断总结,慢慢地演化出来。包括经典的GOF23种模式。大部分的我们都是从此开始学习模式。可学了未必能真正地用在项目中。这当然取决于业务的复杂性,以及是否需要某种模式来解决此问题。不能为了模式而模式,慢慢地时间长了,关于这些模式就慢慢地有些淡忘。

     为了让自己更有设计上的灵感,想自己做些笔记。有时在项目中自己未必接触得到,但是在看一些开源的代码发现它们就是应用了某种模式,此时你会觉得别有一番风味。

    主题: 抽象工厂模式

    意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

    初看上面这句话,真的是让人费解,下面就通过一个实例来一步步解释上面的这句话 。

    大家都知道要组装一台电脑主机需要有:CPU、硬盘、主板、光驱、电源、机箱。至于最后咱们组装出来的主机的是高配还是低配,此时无需关心。用代码表示如下:

    当然此时它们都是一个抽象的产品,因为我不清楚硬盘用的是多大,哪个品牌。CPU是AMD还是Inter等等一系列的抽象产品。 转化为代码如下:

     abstract class ComputerFactory
    {
         public abstract  CPU  CreateCPU() ; //CPU
         public abstract HardDisk CreateHardDisk();//硬盘
         public abstract MotherBoard CreateMotherBoard();//主板
         public abstract CDROM CreateCDROM();//光驱
         public abstract Power CreatePower();//电源
         public abstract MachineBox CreateMachineBox();//机箱


    abstract class CPU
    {
        //
    }

    abstract class HardDisk
    {
        //
    }

    abstract class MotherBoard
    {
        //
    }

    abstract class CDROM
    {
        //
    }

    abstract class Power
    {
        //
    }

    abstract class MachineBox
    {
        //

     接下来我们就要让上面的零部件组合在一起。成为一台能工作的主机

    class WorkMachine 

    {
        private ComputerFactory computer = null;
        public WorkMachine(ComputerFactory computer)
        {
            this.computer = computer;
        }

        //对CPU、硬盘、主板、光驱、电源、机箱、风扇进行安装
        
    //此时这些类会进行交互。如这CPU要装在主板上。光驱要固定在机箱上面等等。
        public void BuildProduct()
        {
            CPU cpu = computer.CreateCPU();
            MotherBoard board = computer.CreateMotherBoard();
            //board.Opreator(cpu);
            
    //等等一些交互。
        }
    }

    大家有没有发现 WorkMachine 这个类里面的所有东西都是抽象出来的,没有依赖具体的类。

    好了到此我们已经完成了大部分的工作。

    接下来就要看我们需要配置什么样的主机了。

    如果想要一台高配置的主机,那么我们只需要对上面的抽象类进行相应的实现如:

     //高配置的主机工厂

    class HeightComputerFactory : ComputerFactory
    {
        public override CDROM CreateCDROM()
        {
          return   new DVD_9ROM();
        }
        public override CPU  CreateCDROM()
        {
            return new InterCore4();
        }
        public override HardDisk CreateCDROM()
        {
            return new HeightHardDisk();
        }
        public override MotherBoard CreateCDROM()
        {
            return new HeightMotherBoard();
        }
        public override Power CreateCDROM()
        {
            return new HeightPower();
        }
        public override MachineBox CreateCDROM()
        {
            return new HeightMachineBox();
        }
    }


    class InterCore4:CPU //来个四核的CPU
    {
        //
    }

     class HeightHardDisk:HardDisk
    {
        //
    }

      class HeightMotherBoard: MotherBoard
    {
        //
    }

      class DVD_9ROM : CDROM//双刻录机
    {
        //
    }

     class HeightPower:Power//高性能电源
    {
        //
    }

     class HeightMachineBox : MachineBox
    {
        //
    }

     最后我们在客户端调用代码如下:class APP

    {
        public static void Main()
        {
            WorkMachine worn = new WorkMachine(new HeightComputerFactory());//如果你觉得此处还有依赖,可以通过配置文件来完成,我认为完成没有必要。
            worn.BuildProduct();
        }
    }

     如果我想配台学习性的主机,此时我们只需要向上面一样实现这些抽象类,就可以,但是WorkMachine这个类我完成没有改动过它哦。

     

    最后再回想一下它的意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

    对于上面所说的一系列就是: ComputerFactory类。同时它里面所有的方法也都是抽象的类,没有具体的实现。

    当然抽象公厂它的前提是 ComputerFactory里面的对像是稳定不变时,比如我再向ComputerFactory类里面添加一个抽象类,此时它就不使用了。

     
     
     
  • 相关阅读:
    湘志恒善.NET 企业实训新学员必读手册
    周末电脑城有感硬件和软件价格的升降(实物图9.22更新)
    企业I期做项目之前的小例子
    商学院企业I班暑期作业 【2008年8月12日更新】
    项目公司机房升级
    android小应用帮美女更衣系列一(附源码)
    android小应用帮美女更衣系列二(附源码)
    @synthesize 和 @property
    VS2008下载地址和版本破解
    Android腾讯微薄客户端开发十三:提及篇(与我有关的微博)
  • 原文地址:https://www.cnblogs.com/qgf522/p/2441156.html
Copyright © 2011-2022 走看看