设计模式目录:html
本篇目录:数据库
其实你们都知道,在工厂方法(Factory Method)模式以前有个简单工厂模式,也就是静态工厂方法(Static Factory Method)模式,在简单工厂模式以前有个咱们都熟悉的三层架构模式,那咱们就上到下一层一层的来了解下。工具
三层架构咱们都熟悉,一开始编程的时候也是用的最多,分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL),实现了“高内聚,低耦合”的思想。post
关于三层架构不须要说太多,我当时学习的时候,无心间看到李天平老师关于三层的趣味理解,以为还蛮有意思的,很适合初学者理解,和你们分享下:学习
经过上面的趣味理解,脑海中应该对三层有个了解了。说到这,其实若是你们学习过MVC(模型Model-视图View-控制器Controller)的话,就发现和三层架构有点类似,都有一个表现层,可是其余两层就不一样了,三层架构中没有Controller这个概念,MVC也没有把业务的逻辑访问当作两个层,这是采用三层架构或MVC搭建程序最主要的区别。固然了。在三层中也提到了Model,可是三层架构中Model的概念与MVC中Model的概念是不同的,“三层”中典型的Model层是以实体类构成的,而MVC里,则是由业务逻辑与访问数据组成的。
this
静态工厂方法(Static Factory Method)模式其实不属于GOF所提出的设计模式中,咱们通常在应用的时候结合三层模式下使用工厂模式使用多点,例以下面的解决方案:url
上面的SeManage.IDAL就至关于抽象产品,SeManage.SQLServerDAL至关于具体产品,SeManage.DALFactory至关于工厂,决定生成何种商品的工厂。
1 /// <summary> 2 /// dal工厂 3 /// </summary> 4 public sealed class DataAccess 5 { 6 private static readonly string SQLServicePath = ConfigurationManager.AppSettings["SQLServerDAL"]; 7 public DataAccess() 8 { } 9 10 /// <summary> 11 /// 建立Changdi数据层接口。 12 /// </summary> 13 public static SeManage.IDAL.IChangdi CreateChangdi() 14 { 15 string className = SQLServicePath + ".Changdi"; 16 return (SeManage.IDAL.IChangdi)Assembly.Load(SQLServicePath).CreateInstance(className); 17 } 18 }
1 <add key="SQLServerDAL" value="SeManage.SQLServerDAL"/>
上面的代码表示根据配置文件来建立何种具体抽象类的实例(产品),下面的配置就像工厂机器的开关,决定生产哪一种产品。
经过上面的代码,咱们也会发现一些问题,若是产品的种类较多,工厂类里面的生产产品的方法也多,若是出现新的产品,那咱们就必须在工厂类里面添加生产新产品的方法,这样就违反了高内聚责任分配原则,使代码变的不容易维护。
工厂方法(Factory Method)模式是在GOF提出的设计模式中有定义的,以下:为建立对象定义一个接口,让子类决定实例化哪一个类,工厂方法让一个类的实例化延迟至子类。
其实从某种方面能够说,工厂方法模式是简单工厂模式的衍生,也解决了简单工厂模式所出现的问题,例如上面所提到的。工厂方法模式其实就是把工厂抽象化了,咱们能够把工厂方法模式拆分红四个元素:抽象工厂(IFactory)、具体工厂(Concrete Factory)、抽象产品(Product)和具体产品(Concrete Product)。根据这四个元素,咱们能够简单的画下UML类图:
根据上面的UML类图,不难实现其代码:
1 /// <summary> 2 /// 产品接口 3 /// </summary> 4 public interface ICar 5 { 6 void Travel(); 7 } 8 9 /// <summary> 10 /// 具体产品 11 /// </summary> 12 public class Lexus : ICar 13 { 14 public void Travel() 15 { 16 Console.WriteLine("I'm a lexus car, I'm traveling"); 17 } 18 } 19 20 /// <summary> 21 /// 工厂接口 22 /// </summary> 23 public interface ICarFactory 24 { 25 ICar CreateCar(); 26 } 27 28 /// <summary> 29 /// 具体工厂类 30 /// </summary> 31 public class LexusFactory : ICarFactory 32 { 33 public ICar CreateCar() 34 { 35 return new Lexus(); 36 } 37 } 38 39 40 public class Client 41 { 42 private ICarFactory carFactory; 43 public Client(ICarFactory carFactory) 44 { 45 this.carFactory = carFactory; 46 } 47 48 public void doSomething() 49 { 50 ICar car = carFactory.CreateCar(); 51 car.Travel(); 52 //to do something 53 } 54 }
调用示例代码:
1 static void Main(string[] args) 2 { 3 Client client = new Client(new LexusFactory()); 4 client.doSomething(); 5 }
从上面的代码咱们能够看出,工厂方法模式的对简单工厂模式进行了抽象。有一个抽象的Factory类(能够是抽象类和接口),这个类将再也不负责具体的产品生产,而是只制定一些规范, 具体的生产工做由其子类去完成。在这个模式中,工厂类和产品类每每能够依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。其实单从这一点上,咱们就会发现,和咱们以前说的《小菜学习设计模式(一)—模板方法(Template)模式》中提到的模板方法模式的思想有些共同的地方,其实工厂方法(Factory Method)模式是最典型的模板方法(Template Method)模式的应用。
示例代码下载:FactoryMethod.rar
插一句:上面的UML是用Edraw Mind Map这一款绘图软件画的,感受还不错,能够画大部分的图,还在熟悉中,绿色版的哦。
下载地址:Edraw Mind Map.rar
骚年们,和小菜一块儿整理学习吧,未完待续。。。