c#设计模式学习1之工厂模式

c#设计模式学习1之简单工厂

         进入程序员这个行业快一年了,写的程序就那么多,一直感觉写的程序没有质的飞跃,看看高手人家的程序,感觉和自己写的差的很大,什么n层了等,看起来都费力,仔细琢磨可能是设计模式很欠缺,理解了设计模式才能是整个项目的代码编写更看起来好一点(0)。所以最近学习一下设计模式,随便记录一下,以后也好回头看看。主要看的资料是c#设计模式,并不是我自己发明的啊(

        前提:学习设计模式,我认为必须要把c#的基本概念和方法掌握熟练,比如,对象,类,接口,抽象类和方法,重写,覆盖,继承

       按照Gang of Four设计模式分为:创建型,结构型和行为型。

       所以创建型模式都涉及到创建对象实例的方式。new运算符是c#最简单的方式。但是程序本身不应该依赖对象如何创建,在不同的情况和需求下,对象创建本身也会有很多方式。

      工厂方法模式:根据我的理解,工厂方法模式就是创建一个“决策类”,这个决策类根据传入的数据,然后实例化抽象基类的多个子类的一个某个对象。先看看简单工厂模式,这个比较容易入门。

     举个实例来说,window项目,建立一个文本框和按钮。这个文本框要求输入用户的姓名,firstname和lastname。中间用空格或逗号分开。点击按钮后得到输入的姓,名字。如果没有空格或逗号的话那都是名字,没有姓氏。一般我写个判断方法是否有空格或逗号也能实现这个功能。但是这简单工厂模式会让我们很容易理解工厂如何去实例化不同的子类对象。

   建立一个基类   public   class Namer
    {
      protected string lname, fname;

      public string getLname()
      {
          return lname;
      }

      public string getFname()
      {
          return fname;
      }
    }

然后有两个子类分别继续这个Namer。

检查空格

 class FirstFirst:Namer
    {
        public FirstFirst(string name)
        {
            int n = name.Trim().IndexOf(" ");
            if (n > 0)
            {
                fname = name.Trim().Substring(0, n);
                lname = name.Trim().Substring(n + 1);
            }
            else
            {
                lname = name;
                fname = "";
            }
        }
    }

      检查逗号

class LastFirst:Namer
    {
        public LastFirst(string name)
        {
            int i = name.Trim().IndexOf(",");
            if (i > 0)
            {
                fname = name.Trim().Substring(0, i);
                lname = name.Trim().Substring(i + 1);
            }
            else
            {
                lname = name.Trim();
                fname = "";
            }
        }
    }

然后我们就要创建工厂了。代码也很好理解,就是根据输入的文本框,创建不同的对象

   class NameFactory
    {
        public NameFactory()
        { }

        public Namer getName(string name)
        {
            int n=name.Trim().IndexOf(",");
            if (n > 0)
            {
                return new LastFirst(name);
            }
            else
            {
                return new FirstFirst(name);
            }
        }
    }

然后在按钮事件中:

 private void button1_Click(object sender, EventArgs e)
        {
            NameFactory nameFac=new NameFactory();
            Namer nm = nameFac.getName(this.textBox1.Text);
            MessageBox.Show("FirstName : " + nm.getFname() + " LastName : " + nm.getLname());
        }

这样我们在调用工厂的getName()时候就不需要知道创建的是哪个类。也不用知道是哪个类的getFname()和getLname()了

  这是我看c#设计模式的一点理解,然后准备工厂模式之工厂方法模式

 

本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。

posted @ 2007-04-14 18:13  音乐啤酒  阅读(163)  评论(0编辑  收藏  举报