园子里关于23种设计模式的博文已经能够说是成千上万、车载斗量、屯街塞巷、不可胜数、数不胜数、摩肩接踵、汗牛充栋、车水马龙、门庭若市、琳琅满目直至让人眼花缭乱了。在这样的大环境下之因此来写设计模式类的博文,并非像一些"非主流"的爱情观那样"宁缺毋滥"。 只是其一呢,由于至关于给本身作一个总结,加深一下本身这方面的认识,由于掌握了和把它写出来我感受后者还能够对技能有一个提高,其二呢是由于最近公司有一个内部的training须要讲设计模式。html
1.介绍: sql
2.延伸: 数据库
3.模拟场景: windows
欧美主导的以赛车为主题的系列电影《速度与激情》系列相信你们都看过,里面的男主角(zhǔ jué,加个拼音,常常听到有人说什么主脚主脚的,虽然以前我也不肯定是zhǔ jué仍是主脚,可是我没念过主脚,我在不肯定的状况下我都是念男一号)范·迪塞尔在每一集里面作不一样的事情都是开不一样的车子,相信你们都以为很酷吧。设计模式
人家酷也没办法,谁叫人家是大佬呢。这里咱们试想一下,若是这是一套程序,咱们该怎么设计?每次不一样的画面或者剧情范·迪塞尔都须要按照导演的安排开不同的车,去参加赛车须要开的是跑车,可能导演就会说下一场戏:范·迪塞尔下一场戏须要开跑车(参数),要去参加五环首届跑车拉力赛,这时候场务(工厂类)接到导演的命令(跑车参数)后须要从车库开出一辆跑车(具体产品)交到范·迪塞尔手上让他去准备五环首届跑车拉力赛。这套程序的整个生命周期就算完成了。(什么?没完成?难不成你还真想来个五环首届跑车拉力赛了啊:)架构
根据导演不一样的指令,开的车是不同的,可是车都是在车库中存在的。车都属于同一种抽象,车库里全部的车都有本身的特征,这些特征就是条件。导演发出指令的时候,只要告诉场务特征,场务就知道提什么车。这就简单工厂模式的典型案例。oracle
4.简单工厂UML类图: (UML图是我用windows自带的paint手工画的,因此可能不是很专业)app
5.代码演示: 框架
抽象产品类代码: ide
namespace CNBlogs.DesignPattern.Common { /// <summary> /// 抽象产品类: 汽车 /// </summary> public interface ICar { void GetCar(); } }
具体产品类代码:
namespace CNBlogs.DesignPattern.Common { public enum CarType { SportCarType = 0, JeepCarType = 1, HatchbackCarType = 2 } /// <summary> /// 具体产品类: 跑车 /// </summary> public class SportCar : ICar { public void GetCar() { Console.WriteLine("场务把跑车交给范·迪塞尔"); } } /// <summary> /// 具体产品类: 越野车 /// </summary> public class JeepCar : ICar { public void GetCar() { Console.WriteLine("场务把越野车交给范·迪塞尔"); } } /// <summary> /// 具体产品类: 两箱车 /// </summary> public class HatchbackCar : ICar { public void GetCar() { Console.WriteLine("场务把两箱车交给范·迪塞尔"); } } }
简单工厂核心代码:
namespace CNBlogs.DesignPattern.Common { public class Factory { public ICar GetCar(CarType carType) { switch (carType) { case CarType.SportCarType: return new SportCar(); case CarType.JeepCarType: return new JeepCar(); case CarType.HatchbackCarType: return new HatchbackCar(); default: throw new Exception("爱上一匹野马,可个人家里没有草原. 你走吧!"); } } } }
客户端调用代码:
//------------------------------------------------------------------------------ // <copyright file="Program.cs" company="CNBlogs Corporation"> // Copyright (C) 2015-2016 All Rights Reserved // 原博文地址: http://www.cnblogs.com/toutou/ // 做 者: 请叫我头头哥 // </copyright> //------------------------------------------------------------------------------ namespace CNBlogs.DesignPattern { using System; using CNBlogs.DesignPattern.Common; class Program { static void Main(string[] args) { ICar car; try { Factory factory = new Factory(); Console.WriteLine("范·迪塞尔下一场戏开跑车。"); car = factory.GetCar(CarType.SportCarType); car.GetCar(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } } }
简单工厂的简单案例就这么多,真正在项目实战的话可能还有须要改进和扩展的地方。因需求而定吧。
6.简单工厂的优势/缺点:
1.介绍:
2.定义:
3.延伸:
4.模拟场景:
5.工厂方法UML类图: (UML图是我用windows自带的paint手工画的,因此可能不是很专业
6.代码演示:
抽象工厂代码:
namespace CNBlogs.DesignPattern.Common { public interface IFactory { ICar CreateCar(); } }
抽象产品代码:
namespace CNBlogs.DesignPattern.Common { public interface ICar { void GetCar(); } }
具体工厂代码:
namespace CNBlogs.DesignPattern.Common { /// <summary> /// 具体工厂类: 用于建立跑车类 /// </summary> public class SportFactory : IFactory { public ICar CreateCar() { return new SportCar(); } } /// <summary> /// 具体工厂类: 用于建立越野车类 /// </summary> public class JeepFactory : IFactory { public ICar CreateCar() { return new JeepCar(); } } /// <summary> /// 具体工厂类: 用于建立两厢车类 /// </summary> public class HatchbackFactory : IFactory { public ICar CreateCar() { return new HatchbackCar(); } } }
具体产品代码:
namespace CNBlogs.DesignPattern.Common { /// <summary> /// 具体产品类: 跑车 /// </summary> public class SportCar : ICar { public void GetCar() { Console.WriteLine("场务把跑车交给范·迪塞尔"); } } /// <summary> /// 具体产品类: 越野车 /// </summary> public class JeepCar : ICar { public void GetCar() { Console.WriteLine("场务把越野车交给范·迪塞尔"); } } /// <summary> /// 具体产品类: 两箱车 /// </summary> public class HatchbackCar : ICar { public void GetCar() { Console.WriteLine("场务把两箱车交给范·迪塞尔"); } } }
客户端代码:
//------------------------------------------------------------------------------ // <copyright file="Program.cs" company="CNBlogs Corporation"> // Copyright (C) 2015-2016 All Rights Reserved // 原博文地址: http://www.cnblogs.com/toutou/ // 做 者: 请叫我头头哥 // </copyright> //------------------------------------------------------------------------------ namespace CNBlogs.DesignPattern { using System.IO; using System.Configuration; using System.Reflection; using CNBlogs.DesignPattern.Common; class Program { static void Main(string[] args) { // 工厂类的类名写在配置文件中能够方便之后修改 string factoryType = ConfigurationManager.AppSettings["FactoryType"]; // 这里把DLL配置在数据库是由于之后数据可能发生改变 // 好比说如今的数据是从sql server取的,之后须要从oracle取的话只须要添加一个访问oracle数据库的工程就好了 string dllName = ConfigurationManager.AppSettings["DllName"]; // 利用.NET提供的反射能够根据类名来建立它的实例,很是方便 var currentAssembly = System.Reflection.Assembly.GetExecutingAssembly(); string codeBase = currentAssembly.CodeBase.ToLower().Replace(currentAssembly.ManifestModule.Name.ToLower(), string.Empty); IFactory factory = Assembly.LoadFrom(Path.Combine(codeBase, dllName)).CreateInstance(factoryType) as IFactory; ICar car = factory.CreateCar(); car.GetCar(); } } }
7.工厂方法的优势/缺点:
1.介绍:
2.定义:
3.模拟场景:
4.场景分析:
上面的场景可能有点稀里糊涂的,可是用OO的思想结合前面的简单工厂和工厂方法的思路去理解的话,也好理解。
下面让咱们来捋一捋这个思路:
5.抽象工厂UML类图: (UML图是我用windows自带的paint手工画的,因此可能不是很专业)
6.代码演示:
抽象工厂代码:
namespace CNBlogs.DesignPattern.Common { /// <summary> /// 抽象工厂类 /// </summary> public abstract class AbstractEquipment { /// <summary> /// 抽象方法: 建立一辆车 /// </summary> /// <returns></returns> public abstract AbstractCar CreateCar(); /// <summary> /// 抽象方法: 建立背包 /// </summary> /// <returns></returns> public abstract AbstractBackpack CreateBackpack(); } }
抽象产品代码:
namespace CNBlogs.DesignPattern.Common { /// <summary> /// 抽象产品: 车抽象类 /// </summary> public abstract class AbstractCar { /// <summary> /// 车的类型属性 /// </summary> public abstract string Type { get; } /// <summary> /// 车的颜色属性 /// </summary> public abstract string Color { get; } } /// <summary> /// 抽象产品: 背包抽象类 /// </summary> public abstract class AbstractBackpack { /// <summary> /// 包的类型属性 /// </summary> public abstract string Type { get; } /// <summary> /// 包的颜色属性 /// </summary> public abstract string Color { get; } } }
具体工厂代码:
namespace CNBlogs.DesignPattern.Common { /// <summary> /// 运动装备 /// </summary> public class SportEquipment : AbstractEquipment { public override AbstractCar CreateCar() { return new SportCar(); } public override AbstractBackpack CreateBackpack() { return new SportBackpack(); } } /// <summary> /// 越野装备 这里就不添加了,同运动装备一个原理,demo里只演示一个,实际项目中能够按需添加 /// </summary> //public class JeepEquipment : AbstractEquipment //{ // public override AbstractCar CreateCar() // { // return new JeeptCar(); // } // public override AbstractBackpack CreateBackpack() // { // return new JeepBackpack(); // } //} }
具体产品代码:
namespace CNBlogs.DesignPattern.Common { /// <summary> /// 跑车 /// </summary> public class SportCar : AbstractCar { private string type = "Sport"; private string color = "Red"; /// <summary> /// 重写基类的Type属性 /// </summary> public override string Type { get { return type; } } /// <summary> /// 重写基类的Color属性 /// </summary> public override string Color { get { return color; } } } /// <summary> /// 运动背包 /// </summary> public class SportBackpack : AbstractBackpack { private string type = "Sport"; private string color = "Red"; /// <summary> /// 重写基类的Type属性 /// </summary> public override string Type { get { return type; } } /// <summary> /// 重写基类的Color属性 /// </summary> public override string Color { get { return color; } } } } //具体产品能够有不少不少, 至于越野类的具体产品这里就不列出来了。
建立装备代码:
namespace CNBlogs.DesignPattern.Common { public class CreateEquipment { private AbstractCar fanCar; private AbstractBackpack fanBackpack; public CreateEquipment(AbstractEquipment equipment) { fanCar = equipment.CreateCar(); fanBackpack = equipment.CreateBackpack(); } public void ReadyEquipment() { Console.WriteLine(string.Format("老范背着{0}色{1}包开着{2}色{3}车。", fanBackpack.Color, fanBackpack.Type, fanCar.Color, fanCar.Type )); } } }
客户端代码:
//------------------------------------------------------------------------------ // <copyright file="Program.cs" company="CNBlogs Corporation"> // Copyright (C) 2015-2016 All Rights Reserved // 原博文地址: http://www.cnblogs.com/toutou/ // 做 者: 请叫我头头哥 // </copyright> //------------------------------------------------------------------------------ namespace CNBlogs.DesignPattern { using System; using System.Configuration; using System.Reflection; using CNBlogs.DesignPattern.Common; class Program { static void Main(string[] args) { // ***具体app.config配置以下*** // //<add key="assemblyName" value="CNBlogs.DesignPattern.Common"/> //<add key="nameSpaceName" value="CNBlogs.DesignPattern.Common"/> //<add key="typename" value="SportEquipment"/> // 建立一个工厂类的实例 string assemblyName = ConfigurationManager.AppSettings["assemblyName"]; string fullTypeName = string.Concat(ConfigurationManager.AppSettings["nameSpaceName"], ".", ConfigurationManager.AppSettings["typename"]); AbstractEquipment factory = (AbstractEquipment)Assembly.Load(assemblyName).CreateInstance(fullTypeName); CreateEquipment equipment = new CreateEquipment(factory); equipment.ReadyEquipment(); Console.Read(); } } }
抽象工厂模式符合了六大原则中的开闭原则、里氏代换原则、依赖倒转原则等等
7.抽象工厂的优势/缺点:
这篇博文从晚上下班7点到家一直写到如今,说了一夜的工厂,也扯了一夜的速度与激情,在本博文完结的最后,给你们来一张速度与激情的画面精彩照。(ps:是否是以为这种画面再配上一曲DJ一瓶啤酒会更嗨啊?哈哈...)
咱们使用设计模式目的无非只有三个:a)缩短开发时间;b)下降维护成本;c)在应用程序之间和内部轻松集成。具体何时使用何种设计模式还得因项目而异。之因此对设计模式旧调重弹只是但愿这个博文能对本身的架构之路有所提高,同时若是能帮助到其余人那就更完美了。
做 者:请叫我头头哥
出 处:http://www.cnblogs.com/toutou/
关于做者:专一于基础平台的项目开发。若有问题或建议,请多多赐教!
版权声明:本文版权归做者和博客园共有,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文连接。
特此声明:全部评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:若是您以为文章对您有帮助,能够点击文章右下角【推荐】一下。您的鼓励是做者坚持原创和持续写做的最大动力!