1、简单工厂模式
工厂类根据提供给它的参数,返回的是几个产品中的一个类的实例。通常情况下,它返回的是一个公共的父类,在这个工厂类里面,父类的引用指向子类的对象
厂长生产杯子时先不让生产线知道我要产的是玻璃的还是瓷的,而是让它在不知道具体材料的情况下先做它能做的,等到它把模具做好,只需要向其中填充玻璃原料或者瓷原料就可以造出同一形状的具体杯子了。所以就有了简单工厂模式。
<span style="font-size:14px;"> class CupFactory
{
public static CUP CreateCup(string 种类)
{
杯子 cup = null;
switch (种类)
{
case “玻璃杯":
{
cup = new GlassCup();
break;
}
case “陶瓷杯":
{
cup = new ChinaCup();
break;
}
}
return cup;
}
}
</span>
<span style="font-size:14px;"> static void Main(string[] args)
{
杯子 cup;
cup = CupFactory.CreateCup(种类);
}
</span>
2、工厂方法模式
定义一个用于创建产品对象的工厂的接口,而将实际创建工作放在工厂接口的子类中。
简单工厂模式有一个问题,就是当我现在想生产一个同样形状的铁杯时,工厂里并没有定义相应的处理流程,只能更改CreateCup方法,这就不合理了(违背封闭原则)。
我现在只是想生产铁杯,你只要在最后的时候把玻璃原料换成铁的不就行了吗,干嘛还要更改整条生产线呢?于是就有了工厂模式。
static void Main(string[] args)
{
IFactory CupFactory = new 铁杯子factory();
Cup cup = CupFactory.CreateCUP();
}
3、抽象工厂模式
用来创建产品族
假如现在工厂主想要生产水壶(kettle),用工厂模式就不得不再造一条水壶生产线,能不能在水杯生产线同时生产水壶呢?这就是抽象工厂模式。在原CupFactory中加一个CreateKettle()方法,用来生产水壶。
总结:
简单工厂模式:用来生产同一等级中的任意产品(不支持增加新产品)。产品具体构造细节是在一个个if/else分支,或者在switch/case分支里面的。如果要增加一个产品,则需要修改工厂类,增加if/else分支,或者增加一个case分支。
工厂方法模式:用来生产同一等级结构中的固定产品(支持增加新产品)。将工厂和产品之间的耦合降低,将具体产品的构造过程放在了具体工厂类里面。在以后扩展产品的时候方便很多,只需要添加一个工厂类,一个产品类,就能方便的添加产品,而不需要修改原有的代码。该模式更符合开发中的OCP原则(open close principle),对扩展开放,对修改关闭。
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
抽象工厂模式:用来生产不同产品族的全部产品(不支持产品增加,但支持产品族的增加)
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。