在园子混迹许久,每日看一些大神的佳作,深感受益匪浅,进而萌生了分享一些知识的想法。当然,作为一个屌丝程序员分享不了多么高大上的知识,只是把平时工作中积累的一些东西共享出来,希望大神们手下留情,不要拍的太狠。呵呵,闲言少叙,书归正传。
简单工厂和工厂方法
GOF创造了设计模式这个家族,为我们写出更面向对象的代码提供了便利。相对于这个家族几乎代代单传,工厂家族可谓是门丁兴旺,今天主要来体验下简单工厂和工厂方法。
这里要说一个题外话,简单工厂模式不属于GOF创造的23种设计模式,最多算一个临时工,出了问题的时候,上镜率较高。
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实
现。
简单点说,可以讲工厂模式比喻成淘宝商铺,而Creator的角色淘宝卖家。对于买家来说,只需要告诉卖家自己要什么,至于这个东西从那个货架下来,进货价格是多少(应该不会有好心的卖家告诉你进货价格是多少吧),就和客户没一毛钱关系没有了,因为这些具体的实现细节是没有必要也是不应该告诉调用曾的。
看一下类图:
示例代码:
public class Creator
{
private Product product;
public Product Product
{
get
{
return product;
}
}
private Product CreateProduct(int type)
{
switch (type )
{
case 1:
product = new ProductA();
break;
case 2:
product = new ProductB();
break;
case 3:
product = new ProductC();
break;
default:
product = null;
break;
}
return null;
}
}
在Creator类中,由CreateProduct方法返回Product的一个实例,具体实例化哪一个类由CreateProduct的逻辑决定。使用这个模式,我们可以轻松的将客户端对具体产品的依赖去除。
请大家养成一个好习惯,在写完代码后可以去对照SOLID原则来审查一下自己的代码。我们明显的可以发现,Creator类违反了开闭原则(OCP)。当我们增加一个Product实现的时候,就必然的需要在Creator类中修改CreateProduct方法。这时候就需要工厂方法出马了。
工厂方法模式(Factory Method)定义了一个用于创建对象的接口,让子类来决定实例化哪一个类。工厂方法使一个类的实例化被延迟到其子类。
类图:
示例代码:
抽象创建类:
public abstract class Creater
{
public Product product;
abstract public void CreateProduct();
public void ConstructObjects()
{
//必须要创建对象
CreateProduct();
}
}
创建类:
public class ConcreteCreater : Creater
{
public override void CreateProduct()
{
//throw new NotImplementedException();
product = new ConcreteProduct();
}
}
抽象产品类:
public abstract class Product
{
abstract public void Test();
}
产品类:
public class ConcreteProduct : Product
{
public override void Test()
{
//throw new NotImplementedException();
Console.Write("This is facoty method sample");
}
}
这样在新添加一个产品类A的时候,对应的需要在Product中添加一个子类ConcreteProductA,并且在Create中添加一个子类ConcreteCreaterA。
以上简单的比较了简单工厂和工厂方法。写完不禁需要思考一个问题:在什么情况下使用工厂模式?
我个人觉得有以下几个方面,也希望各路大神不吝赐教。
1,需要隐藏产品类的实现细节。
2,分离客户端创建产品类的过程,从而将产品类和客户端解耦