博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

今天来学习工厂类创建型模式。创建型模式的目的就是为了管理对象的创建。
我先学习的Abstract Factory模式。学习完这个模式之后,给我的感觉是理解了。前面Strategy和Bridge模式中的对象创建问题解决了。但是,后来遇到Factory Method模式时,又产生了些疑问,他们的根本区别究竟在哪里?应用上有什么样的不同?在网上察看了一些资料之后,发现还有一个简单工厂模式,这又是什么东东?
我们通常创建一个对象的方法就是new,这个前提是我们知道这是一个具体什么东西,比如:笔。但是,这个概念太笼统,是钢笔、圆珠笔、铅笔?我选钢笔。可是这个概念仍然太笼统,我要的是英雄牌的,还是派克的,还是万宝龙的?我选英雄。但是,英雄钢笔型号很多阿,有粗的有细的,还有会计用的特细。我要特细的。于是,我创建一个英雄牌的特细的钢笔。这样的话,对于我来说太累了。回头,我换支笔也很麻烦。我只想知道我要一支笔,什么笔我不知道,给我什么我用什么。怎么做呢?我们用工厂类模式。下面,我们一步步的来说明各个工厂类模式。
首先,还是来做一些准备。我们定义了笔的抽象类,钢笔、铅笔都继承自它。
public abstract class BI
{
    public abstract void Writting(string strWord);
}
public class Pen: BI
{
    public override void Writting(string strWord)
    {
        print strWord;
    }
}
public class Pencil: BI
{
    public override void Writting(string strWord)
    {
        print strWord;
    }
}
那么如果是简单的创建对象的话,我们可能会这样做
Pen penA = new Pen();
penA.Writting(“姓名”);
Pencil pencilA = new Pencil()
pencilA.Writting(“工厂模式”);
当然,我们也可能会这么做
BI biA;
biA = new Pen();
biA.Writting(“姓名”);
这里很显然,我必须知道具体的笔,而且,如果根据需要想换一支笔的时候,不得不修改我的客户端代码。
下面我们进入工厂模式,看看他是怎么做的。

1.简单工厂模式。这个模式在Gof的23种模式中是没有的,但是它是工厂类模式的入门模式。现在看看这个模式是怎么回事。比如,我现在要在文件上签名,需要一支笔。签名一般是不能修改的。然后我找工厂,说我要一支笔。工厂问我,要什么笔。我不知道。问我干什么。我说要签字。工厂就知道了,给我一支普通钢笔。我知道是笔能写字签名就行了。
public class Factory
{
    public static BI Create(string UseType)
    {
        switch(UseType)
        {
            case "签名":
                return new Pen();
            case "写文章":
                return new BallPen();
            case "打草稿":
                return new Pencil();
        }
        return null;
    }
}
于是,我就这样做
Factory factoryA = new Factory();
BI biA = factoryA.Create(“签名”);
biA.Writting(“姓名”);
可以看到,我根本不知道这是什么笔,我也不关心它。我用一个类来负责笔的创建工作,把笔的使用和创建完全分离,这就是简单工厂模式。所谓工厂,就是负责生产出产品的地方,而我只负责使用产品。这样的好处是,松耦合,实现了责任的分割,使用与创建互不影响。上面提到的两个问题,都得到了解决。
但是,我们也要看到,如果,我再添加一个新的笔:毛笔,我不得不修改工厂类来适应。这一点不符合“开—闭”原则。怎么办呢?

来源:http://blog.163.com/jsj_wyf@126/blog/static/418223202008111893013224/