.NET中的设计模式一:工厂模式 选择自 lane_cn 的 Blog

原创 2004年11月04日 11:38:00

设计模式概述

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

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

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

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

工厂模式(Factory)

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

    工厂模式的要点:

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

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

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

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

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

o_img001.gif

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类,用于根据不同情况产生具体的类。调用者不必关心自己调用的是谁。大大简化了业务代码。

 

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

j2ee常用的设计模式?说明工厂模式

Java中的23种设计模式:Factory(工厂模式),Builder(建造模式),Factory Method(工厂方法模式),Prototype(原始模型模式),Singleton(单例模式),F...
  • v_fei
  • v_fei
  • 2007年11月28日 09:36
  • 1309

设计模式在cocos2d-x中的使用--简单工厂模式(Simple Factory)

什么是简单工厂模式? 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个...
  • oktears
  • oktears
  • 2014年06月29日 15:40
  • 2191

简单工厂设计模式的好处

简单工厂:单独的,创建对象,返回对象。 在一个方法中创建好对象,调用此方法即根据传入参数可获得到不同需求的对象,我曾纳闷为什么要单独创建对象,为什么不直接new对象使用? 唉,好处就在这儿,咋想想...
  • Java_Dmz
  • Java_Dmz
  • 2017年09月02日 13:58
  • 224

.NET中的设计模式二:单件模式 选择自 lane_cn 的 Blog

 单件模式(Singleton)是一个非常简单的模式,这是我第一个理解并且能运用的模式。有时候模式的复杂程度并不在于本身,而是由于他的应用目的。最初的时候面对一个模式经常充满了困惑,一个简单的调用为什...
  • web_gus
  • web_gus
  • 2004年11月04日 11:40
  • 628

.NET中的设计模式三:组合模式 选择自 lane_cn 的 Blog

 组合模式(Composite)是一种“结构型”模式(Structural)。结构型模式涉及的对象为两个或两个以上,表示对象之间的活动,与对象的结构有关。 先举一个组合模式的小小例子:如图:系统中有两...
  • web_gus
  • web_gus
  • 2004年11月25日 09:04
  • 902

.NET中的设计模式五:观察者模式 选择自 lane_cn 的 Blog

 观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的...
  • web_gus
  • web_gus
  • 2004年11月25日 08:58
  • 834

.NET中的设计模式四:命令模式 选择自 lane_cn 的 Blog

命令模式(Command)结构并不复杂,简单的说,就是将某些职责封装成对象,对象的激发者(Invoker)和接收者(Reciever)都不过问命令的执行过程。用这样的方式解除了激发者和接受者之间的耦合...
  • web_gus
  • web_gus
  • 2004年11月25日 09:02
  • 771

每天一整理-java设计模式之工厂模式模式

工厂模式是我们很常用的一个模式,在ssh框架和ssm框架中都普遍使用到的工厂模式 工厂模式的定义一个用于创建对象的接口,让子类决定实例化哪个类 在这里我主要讲通过反射机制来决定生成类的工厂实现方法...
  • soybeen
  • soybeen
  • 2017年05月01日 09:26
  • 328

设计模式——工厂方法 Java源代码

本程序改编自《Head First Design Patterns》中的Pizza例子,我本学期早上经常吃包子。总共有11个类:...
  • u013390476
  • u013390476
  • 2015年12月22日 12:52
  • 3424

Spring中的设计模式--工厂方法模式

关于工厂模式的误会这是个老生常谈的问题,很多新手或者不太在意设计模式的同事会对工厂模式有极深的误解,总会把“工厂模式”与“静态工厂方法”混为一谈,什么是静态工厂方法呢?可以看一个非常简单的例子:pub...
  • zstu_cc
  • zstu_cc
  • 2017年01月02日 19:40
  • 4227
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: .NET中的设计模式一:工厂模式 选择自 lane_cn 的 Blog
举报原因:
原因补充:

(最多只允许输入30个字)