zoukankan      html  css  js  c++  java
  • .NET中的设计模式之一:工厂模式>factory mode

    设计模式概述

            设计模式从本质上说是一种规则,从形式上说,分为创建型、结构型、行为型。

            设计模式的应用是为了实现软件设计中的几个原则,其中一个重要原则是:减少模块之间的耦合程度。为了确保这个目的,在设计一个类时,要针对接口,而非实现。(Programming to an Interface, not an Implementation)设计的时候只关心类的接口,编程的时候可以先实现一个简单的接口,供别的模块调用。使用一个类的时候只对接口工作,不关心具体的实现,也不关心具体的类型。这样也符合人类认识世界的规律,一般说来人们总是先了解一个事情的大概情况,比如,我们先了解一台电视机的大概功能,然后才能了解每个功能具体是怎样实现的。

            开始的时候不提供实现,正是为了以后能够最大限度的实现。

            设计模式不受语言的限制,使用.net或者java更容易实现。

    工厂模式(Factory)

            工厂模式属于一种创建型模式(Creational)。同样属于创建型模式的还有单件模式(Singleton),以后有机会再说。

        工厂模式的要点:

        1:存在一个创建对象的工厂;

        2:调用者从工厂中取得某些对象;

        3:由工厂决定如何创建对象;

        4:客户不知道对象是如何生成的。

    举一个例子,下面的类视图:

            Namer对象是FirstFirst和LastFirst的基类,用户调用Namer类的时候,不直接new出Namer类或者他的子类,而是使用NameFactory的getName方法得到具体的对象。这样在用户就不用关心自己正在使用的是哪一个Namer,正在调用哪一个方法。用户只针对Namer进行工作,而不用关心具体的类型。在实际工程中可以将Namer类的子类的构造函数只对NameFactory开放,进一步限制程序员。

    C#代码如下:

    1:Namer的实现

    using System;

     

    namespace NameFactory

    {

        /// <summary>

        /// Summary description for Namer.

        /// </summary>

        //Base class for getting split names

        public class Namer {

            //parts stored here

            protected string frName, lName; 

            //return first name

            public string getFrname()
                {

                return frName;

                 }

            //return last name

            public string getLname()
              {

                return lName;

               }

        }

    }

    2:FirstFirst类的实现

    using System;

    namespace NameFactory

    {

        /// <summary>

        /// Summary description for FirstFirst.

        /// </summary>

         public class FirstFirst : Namer

        {

            public FirstFirst(string name)

            {

                int i = name.IndexOf (" ");

                if(i > 0) {

                    frName = name.Substring (0, i).Trim ();

                    lName = name.Substring (i + 1).Trim ();

                }

                else {

                    lName = name;

                    frName = "";

                }

            }

        }

    }

    3:LastFirst类的实现

    using System;

    namespace NameFactory

    {

        /// <summary>

        /// Summary description for LastFirst.

        /// </summary>

         public class LastFirst : Namer

        {

            public LastFirst(string name) {

                int i = name.IndexOf (",");

                if(i > 0) {

                    lName = name.Substring (0, i);

                    frName = name.Substring (i + 1).Trim ();

                }

                else {

                    lName = name;

                    frName = "";

                }

            }

        }

    }

    4:NameFactory,工厂的实现

    using System;

    namespace NameFactory

    {

        /// <summary>

        /// Summary description for NameFactory

        /// </summary>    
    public class NameFactory {

            public NameFactory() {}

            public Namer getName(string name) {

                int i = name.IndexOf (",");

                if(i > 0)

                    return new LastFirst (name);

                else

                    return new FirstFirst (name)

            }

        }

    }

    5:调用者,一个窗体,如图:

    按钮的响应事件代码如下:

    private void btCompute_Click(object sender, System.EventArgs e) 
          {

        Namer nm = nameFact.getName (txName.Text );

        txFirst.Text = nm.getFrname ();

        txLast.Text = nm.getLname ();

          }

            程序并不复杂,运行不运行无所谓,关键是要搞清楚Factory所起的作用:他隐藏了Namer类的创建细节,调用者始终不知道他创建的是哪一个类,也不需要关心他调用的方法是哪一个子类的。如果以后的程序的需求发生改动,比如:某国的人不仅有First Name和Last Name,还有Mid Name,就可以很方便的进行扩充,添加一个Namer的子类,修改一下Factory。调用者甚至不知道有新加了一种Namer的类型。

    实际的应用

            举一个简单的例子:工程中需要使用多种数据库,Oracle、SQL Server、Sybase,为这些数据库建立了各自的连接和查询操作的类,这些类有一个共同的基类BaseConn。可以建立一个ConnFactory类,用于根据不同情况产生具体的类。调用者不必关心自己调用的是谁。大大简化了业务代码。

            实际的使用例子还有很多。

  • 相关阅读:
    Leetcode Reverse Words in a String
    topcoder SRM 619 DIV2 GoodCompanyDivTwo
    topcoder SRM 618 DIV2 MovingRooksDiv2
    topcoder SRM 618 DIV2 WritingWords
    topcoder SRM 618 DIV2 LongWordsDiv2
    Zepto Code Rush 2014 A. Feed with Candy
    Zepto Code Rush 2014 B
    Codeforces Round #245 (Div. 2) B
    Codeforces Round #245 (Div. 2) A
    Codeforces Round #247 (Div. 2) B
  • 原文地址:https://www.cnblogs.com/chorrysky/p/526360.html
Copyright © 2011-2022 走看看