FactoryMethod工厂方法(创建型模式)

 最近看了李建宗老师的面向对象的设计模式的课程。我把里面的代码记录了下来以供大家参考。其中有的地方我整理了一下,可能有的地方和课程里的不一样。

动机:
  在软件系统中,经常面临着“某个对象”的创建工作;由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口。
  如何应对这种变化?如何提供一种“封闭机制”来隔离出“这个易变对象”的变化,从而保持系统中“其他依赖该对象”不随着需求改变而改变?

意图:
  定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。
  出自:《设计模式》GoF

Factory Method模式的几个要点:
  1、Factory Method模式主要用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系会导致软件的脆弱。
  2、Factory Method模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从面实现一个种扩展(而非更改)的策略,较好地解决了这种对耦合关系。
  3、Factory Method模式解决“单个对象”的需求变化,Abstract Factory模式解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化。
识别工厂方法模式:
   工厂方法模式需要包括一个操作,这个操作创建了一个对象,同时也使客户无需了解应该具体实例化哪个类.

稳定部分代码:
 1using System;
 2
 3namespace NameFactory
 4{
 5    /// <summary>
 6    /// Summary description for Namer.
 7    /// </summary>

 8    //Base class for getting split names
 9    public class Namer     {
10        //parts stored here
11        protected string frName, lName;
12        
13        //return first name
14        public string getFrname(){
15            return frName;
16        }

17        //return last name
18        public string getLname() {
19            return lName;
20        }

21    }

22}
具体类
 1using System;
 2
 3namespace NameFactory
 4{
 5    /// <summary>
 6    /// Summary description for FirstFirst.
 7    /// </summary>

 8    public class FirstFirst : Namer
 9    {
10        public FirstFirst(string name)
11        {
12            int i = name.IndexOf (" ");
13            if(i > 0{
14                frName = name.Substring (0, i).Trim ();
15                lName = name.Substring (i + 1).Trim ();
16            }

17            else {
18                lName = name;
19                frName = "";
20            }

21        }

22    }

23    public class LastFirst : Namer
24    {
25        public LastFirst(string name)         {
26            int i = name.IndexOf (",");
27            if(i > 0{
28                lName = name.Substring (0, i);
29                frName = name.Substring (i + 1).Trim ();
30            }

31            else {
32                lName = name;
33                frName = "";
34            }

35        }

36    }

37}

38
实例化:
 1using System;
 2
 3namespace NameFactory
 4{
 5    /// <summary>
 6    /// Summary description for NameFactory.
 7    /// </summary>

 8    public class NameFactory     {
 9        public NameFactory() {}
10
11        public Namer getName(string name) {
12            int i = name.IndexOf (",");
13            if(i > 0)
14                return new LastFirst (name);
15            else
16                return new FirstFirst (name);
17        }

18    }

19}

20
主程序
  1using System;
  2using System.Drawing;
  3using System.Collections;
  4using System.ComponentModel;
  5using System.Windows.Forms;
  6using System.Data;
  7
  8namespace NameFactory
  9{
 10    /// <summary>
 11    /// Summary description for Form1.
 12    /// </summary>

 13    public class Form1 : System.Windows.Forms.Form
 14    {
 15        private System.Windows.Forms.Label label1;
 16        private System.Windows.Forms.Button btCompute;
 17        private System.Windows.Forms.Label label2;
 18        private System.Windows.Forms.Label label3;
 19        private System.Windows.Forms.TextBox txFirst;
 20        private NameFactory nameFact;
 21        private System.Windows.Forms.TextBox txName;
 22        private System.Windows.Forms.TextBox txLast;
 23        /// <summary>
 24        /// Required designer variable.
 25        /// </summary>

 26        private System.ComponentModel.Container components = null;
 27        private void init() {
 28            nameFact = new NameFactory ();
 29        }

 30        public Form1()
 31        {
 32            //
 33            // Required for Windows Form Designer support
 34            //
 35            InitializeComponent();
 36            init();
 37
 38            //
 39            // TODO: Add any constructor code after InitializeComponent call
 40            //
 41        }

 42
 43        /// <summary>
 44        /// Clean up any resources being used.
 45        /// </summary>

 46        protected override void Dispose( bool disposing )
 47        {
 48            if( disposing )
 49            {
 50                if (components != null
 51                {
 52                    components.Dispose();
 53                }

 54            }

 55            base.Dispose( disposing );
 56        }

 57
 58        Windows Form Designer generated code
152
153        /// <summary>
154        /// The main entry point for the application.
155        /// </summary>

156        [STAThread]
157        static void Main() 
158        {
159            Application.Run(new Form1());
160        }

161
162        private void btCompute_Click(object sender, System.EventArgs e) {
163            Namer nm = nameFact.getName (txName.Text );
164            txFirst.Text = nm.getFrname ();
165            txLast.Text = nm.getLname ();
166        }

167    }

168}

169

posted on 2006-08-16 17:43  walker  阅读(215)  评论(0编辑  收藏  举报

导航