首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

创造型设计模式

2013-02-18 
创建型设计模式一:创建型设计模式整体总结图二:具体设计模式 1,工厂方法模型 1)定义:定义一个用于创建对象

创建型设计模式
一:创建型设计模式整体总结图

 

创造型设计模式

 

二:具体设计模式

 

1,工厂方法模型

 

1)定义:

      定义一个用于创建对象的接口,让子类去决定实例化哪个类

2)优点:

      克服了简单工厂违背开放封闭原则的缺点,又保持了对象创建过程的优点

 

3)类图

创造型设计模式

 

 

2,抽象工厂

 

1)定义:

     提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类

2)优点:

    让具体的创建实例过程与客户端分离,客户端是通过他们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户端代码中

 

3)类图

创造型设计模式

 

 

3,单例模式

 

1)定义:

     保证一个类仅有一个实例,并提供一个访问它的全局访问点

 

4,原型模式

 

1)定义:

     用原型实例指定创建对象的种类,并且通过拷贝这些原型实例创建新的对象

 

2)类图

创造型设计模式

 

5,建造者模式

 

1)定义:

      将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示

 

2)类图

创造型设计模式

三:代码实现

 

   快要过年啦,很多同学都在网上购买火车票回家,有时候还是买不上票。现在就以火车票为例,运用设计模式的思想,去练习巩固设计模式。

 

1,简单工厂

 假如,规定好乘车区间,学生票票价是100,成人票价为200,要求简单显示购买火车票类型极其票价

 

类图:

创造型设计模式

 

代码实现:

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace 火车票{    class Program    {        static void Main(string[] args)        {            Ticket ticket = FactoryTicket.CreateTicket("学生票");  //传入参数“学生票”,让火车票工厂去实例化对象的学生票类            ticket.GetTicket();             Ticket ticket2 = FactoryTicket.CreateTicket("成人票");            ticket2.GetTicket();             Console.Read();        }    }    //火车票工厂    class FactoryTicket    {        public static Ticket CreateTicket(string type)//根据提供的类型,去实例化具体的火车票对象        {            Ticket ticket = null;            switch (type)            {                 case"学生票":                    ticket = new StudentTicket();  //如果是学生票,则返回学生票子类                    break;                case"成人票":                    ticket = new GeneralTicket();  //如果是成人票,则返回成人票子类                    break;            }            return ticket;        }    }    //火车票基类    class Ticket    {        private string money;        public string Money        {            get { return money; }            set { money = value; }        }        public virtual void GetTicket() //打印获得火车票的类型和价钱        { }    }    //学生票    class StudentTicket:Ticket    {        private string money = "100";                public override void GetTicket()        {             Console .WriteLine ("您选择的是 学生票,票价为:{0}元",money );        }    }    //成人票    class GeneralTicket:Ticket     {        private string money = "200";        public override void  GetTicket()        {            Console.WriteLine("您选择的是 成人票,票价为:{0}元",money );        }    }}


 

运行结果:

 

创造型设计模式

 



2,抽象工厂

假设购买火车票的人只有姓名一个属性,要求,显示购买火车票或成人票。

类图


类图:

创造型设计模式

代码实现:

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace 火车票{    class Program    {        static void Main(string[] args)        {            People li = new People("李");//实例化购买火车票的人li            IFactoryTicket factory = new StuTicketFactory();            ITicket iticket = factory.CreateTicket();            iticket.GetTicket();            Console.Read();        }    }    //火车票工厂接口,定义一个创建火车票的抽象工厂接口    interface IFactoryTicket    {        ITicket CreateTicket();    }    //实现IFactoryTicket接口,实例化StudentTicket    class StuTicketFactory:IFactoryTicket     {        public ITicket CreateTicket()        {            return new StudentTicket();        }    }    //实现IFactoryTicket接口,实例化GeneralTicket    class GenTicketFactory : IFactoryTicket    {        public ITicket CreateTicket()        {            return new GeneralTicket();        }    }    //火车票基类    interface  ITicket    {        void GetTicket(); //打印获得火车票的类型和价钱           }    //学生票    class StudentTicket:ITicket    {             public  void GetTicket()        {             Console .WriteLine ("您选择的是 学生票 ");        }    }    //成人票    class GeneralTicket:ITicket     {                public  void  GetTicket()        {            Console.WriteLine("您选择的是 成人票 ");        }    }    //定义购买火车票的人类    class People    {        private string name;        public string Name        {            get { return name; }            set { name = value; }        }        public People() { }        public People(string name)        {            this.name = name;        }    }}


运行结果:

 

创造型设计模式

 



3,原型模式

假设,车票只显示购票者的姓名,票的类型(学生票,成人票),分别打印学生票和成人票,这里仅一张学生票,一张成人票(打印的票数多了,原型模式就方便啦)。

采用原型模式,通过拷贝原型创建不同的火车票。


类图:

创造型设计模式


代码实现:

namespace 火车票{    class Program    {        static void Main(string[] args)        {            Ticket ticket1 = new Ticket("li");            ticket1.Type("学生票");            ticket1.GetTicket();            Ticket ticket2 = new Ticket("lisz");            ticket2.Type("成人票");            ticket2.GetTicket();            Console.Read();                             }    }    class Ticket : ICloneable    {        private string username;        private string type;        public Ticket(string username)        {            this.username = username;        }        public void Type(string type)        {            this.type = type;        }        public void GetTicket()        {            Console.WriteLine("{0}:您购买的是{1}", username, type);        }        public object Clone()        {            return (object)this.MemberwiseClone();        }    }}

运行结果:

 

创造型设计模式

 



4,单例模式

一个用户只能购买一张车次的票,假如时间段确定,车次确定。

双重锁定,代码实现:

namespace 火车票{    class Program    {        static void Main(string[] args)        {            Ticket ticket = Ticket.GetTicket();            Ticket ticket1 = Ticket.GetTicket();            if (ticket == ticket1)            {                Console.WriteLine("两个对象是相同的实例");            }            Console.Read();        }               }    class Ticket    {        private static Ticket instance;        private static readonly object syncRoot = new object();//程序运行时,创建一个静态只读的进程辅助对象        private string username;        public Ticket() { }        public static Ticket GetTicket()        {            if (instance == null)//先判断实例是否存在,不存在再进行加锁处理            {                lock (syncRoot)                {                    if (instance == null)                    {                        instance = new Ticket();                    }                }            }            return instance;        }    }}

四:总结适用性

 

1,工厂方法模型

    工厂模式用来生产同一等级结构中的固定产品

    当类不知道他所创建的对象的类

 

2,抽象工厂模型

     抽象工厂模式用来生产不同产品族的全部产品

    当要强调一系列相关的产品对象设计,以便进行联合使用

    当提供一个产品类库,而只是想显示他们的接口而不是实现时

 

3,单例模式

     当类只能由一个实例,而且客户可以从一个众所周知的访问点访问他

     当唯一的实例是通过子类实例化的,而且无需更改代码就能实现扩展

 

4,原型模式

     当要实例化的类是在运行时指定

     当一个类的实例只能由几个不同状态组合中的一种

 

5,建造者模式

     当创建复杂对象的算法独立于该对象的组成部分

1楼jiben2qingshan昨天 08:55
加油!

热点排行