设计模式(创建型)

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

 

 

二:具体设计模式

 

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,建造者模式

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

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值