步步为营之——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类里面添加一个抽象类,此时它就不使用了。

 
 
 

 

posted @ 2012-04-11 17:49  娃哈哈ABC  阅读(825)  评论(0编辑  收藏  举报