步步为营之——Abstract Factory 抽象工厂模式
对于设计模式,我认为都是通过大量实践经验、前人的来断总结,慢慢地演化出来。包括经典的GOF23种模式。大部分的我们都是从此开始学习模式。可学了未必能真正地用在项目中。这当然取决于业务的复杂性,以及是否需要某种模式来解决此问题。不能为了模式而模式,慢慢地时间长了,关于这些模式就慢慢地有些淡忘。
为了让自己更有设计上的灵感,想自己做些笔记。有时在项目中自己未必接触得到,但是在看一些开源的代码发现它们就是应用了某种模式,此时你会觉得别有一番风味。
主题: 抽象工厂模式
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
初看上面这句话,真的是让人费解,下面就通过一个实例来一步步解释上面的这句话 。
大家都知道要组装一台电脑主机需要有:CPU、硬盘、主板、光驱、电源、机箱。至于最后咱们组装出来的主机的是高配还是低配,此时无需关心。用代码表示如下:
当然此时它们都是一个抽象的产品,因为我不清楚硬盘用的是多大,哪个品牌。CPU是AMD还是Inter等等一系列的抽象产品。 转化为代码如下:
{
public abstract CPU CreateCPU() ; //CPU
abstract class CPU
{
//
}
abstract class HardDisk
{
//
}
abstract class MotherBoard
{
//
}
abstract class CDROM
{
//
}
abstract class Power
{
//
}
abstract class MachineBox
{
//
}
接下来我们就要让上面的零部件组合在一起。成为一台能工作的主机
{
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 这个类里面的所有东西都是抽象出来的,没有依赖具体的类。
好了到此我们已经完成了大部分的工作。
接下来就要看我们需要配置什么样的主机了。
如果想要一台高配置的主机,那么我们只需要对上面的抽象类进行相应的实现如:
//高配置的主机工厂
{
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类里面添加一个抽象类,此时它就不使用了。