zoukankan      html  css  js  c++  java
  • 设计模式学习心得之工厂类模式(一)简单工厂模式

    今天来学习工厂类创建型模式。创建型模式的目的就是为了管理对象的创建。
    我先学习的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/

  • 相关阅读:
    Idea maven项目不能新建package和class的解决【转】
    Spring事务管理源码分析
    POI操作EXCEL之导出Excel(设置有效性,下拉列表引用)
    Idea之Tomcat
    idea 之git使用详细教程
    Redisson教程
    Redisson整合Spring
    IntelliJ IDEA 工具技巧
    nginx代理tomcat后,tomcat获取真实(非proxy,非别名)nginx服务端ip端口的解决方案
    Idea构建Maven项目教程
  • 原文地址:https://www.cnblogs.com/sontin/p/1929813.html
Copyright © 2011-2022 走看看