15 设计模式教学课件

上传人:n**** 文档编号:80109840 上传时间:2019-02-18 格式:PPT 页数:54 大小:1.22MB
返回 下载 相关 举报
15 设计模式教学课件_第1页
第1页 / 共54页
15 设计模式教学课件_第2页
第2页 / 共54页
15 设计模式教学课件_第3页
第3页 / 共54页
15 设计模式教学课件_第4页
第4页 / 共54页
15 设计模式教学课件_第5页
第5页 / 共54页
点击查看更多>>
资源描述

《15 设计模式教学课件》由会员分享,可在线阅读,更多相关《15 设计模式教学课件(54页珍藏版)》请在金锄头文库上搜索。

1、抽象工厂(Abstract Factory)模式,换DB的例子,从使用Acess换为使用SqlServer 从SqlServer换为Oracle 由于数据库使用的命名空间不同,用到的方法不同,所以很难直接替换,往往要用时间摆平。,模拟数据库访问例子:,class User private int _id; public int ID get return _id; set _id = value; private string _name; public string Name get return _name; set _name = value; ,User表,操作User表,class

2、SqlserverUser public void Insert(User user) Console.WriteLine(“在Sqlserver中给User表增加一条记录“); public User GetUser(int id) Console.WriteLine(“在Sqlserver中根据ID得到User表一条记录“); return null; ,客户端代码,class Program static void Main(string args) User user = new User(); SqlserverUser su = new SqlserverUser(); su.In

3、sert(user); su.GetUser(1); Console.Read(); ,su对象被框死在Sql Server上了,再换数据库时,不够灵活。考虑多态,用工厂方法模式的数据访问程序,用户类不变 class User private int _id; public int ID get return _id; set _id = value; private string _name; public string Name get return _name; set _name = value; ,IUser接口,解除与具体数据库访问的耦合,interface IUser void

4、Insert(User user); User GetUser(int id); ,用于访问SqlServer的User,class SqlserverUser : IUser public void Insert(User user) Console.WriteLine(“在Sqlserver中给User表增加一条记录“); public User GetUser(int id) Console.WriteLine(“在Sqlserver中根据ID得到User表一条记录“); return null; ,用于访问Access的User,定义一个创建访问User表对象的工厂接口,interfa

5、ce IFactory IUser CreateUser(); ,实例化SqlserverUser,class SqlServerFactory : IFactory public IUser CreateUser() return new SqlserverUser(); ,实例化AccessUser,class AccessFactory : IFactory public IUser CreateUser() return new AccessUser(); ,客户端,static void Main(string args) User user = new User(); IFacto

6、ry factory = new AccessFactory(); IUser iu = factory.CreateUser(); iu.Insert(user); iu.GetUser(1); Console.Read(); ,若要改成SqlServer数据库,只须改此处,考虑另一个问题,数据库里除了有User表之外,可能还有其他表,比方说Department等。,class Department private int _id; public int ID get return _id; set _id = value; ,private string _deptName; public

7、 string DeptName get return _deptName; set _deptName = value; ,用于客户端访问,解除与具体数据库访问的耦合,interface IDepartment void Insert(Department department); Department GetDepartment(int id); ,用于访问SqlServer的Department,class SqlserverDepartment : IDepartment public void Insert(Department department) Console.WriteLi

8、ne(“在Sqlserver中给Department表增加一条记录“); public Department GetDepartment(int id) Console.WriteLine(“在Sqlserver中根据ID得到Department表一条记录“); return null; ,用于访问Access的Department,class AccessDepartment : IDepartment public void Insert(Department department) Console.WriteLine(“在Access中给Department表增加一条记录“); publ

9、ic Department GetDepartment(int id) Console.WriteLine(“在Access中根据ID得到Department表一条记录“); return null; ,interface IFactory IUser CreateUser(); IDepartment CreateDepartment(); ,实例化SqlserverUser和SqlserverDepartment,class SqlServerFactory : IFactory public IUser CreateUser() return new SqlserverUser(); p

10、ublic IDepartment CreateDepartment() return new SqlserverDepartment(); ,实例化AccessUser和AccessDepartment,class AccessFactory : IFactory public IUser CreateUser() return new AccessUser(); public IDepartment CreateDepartment() return new AccessDepartment(); ,客户端,class Program static void Main(string arg

11、s) User user = new User(); Department dept = new Department(); / IFactory factory = new SqlServerFactory(); IFactory factory = new AccessFactory(); IUser iu = factory.CreateUser(); iu.Insert(user); iu.GetUser(1); IDepartment id = factory.CreateDepartment(); id.Insert(dept); id.GetDepartment(1); Cons

12、ole.Read(); ,以上所使用的就是抽象工厂模式 抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。 定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类,为了方便引进抽象工厂模式,引进一个新概念:产品族(Product Family)。所谓产品族,是指位于不同产品等级结构,功能相关联的产品组成的家族。如图:,图中一共有四个产品族,分布于三个不同的产品等级结构中。 只要指明一个产品所处的产品族以及它所属的等级结构, 就可以唯一的确定这个产品。,引进抽象工厂模式,所谓的抽象工厂是指一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象。

13、如果用图来描述的话,如下图:,Abstract Factory模式的结构,用产品族描述如下,抽象工厂(Abstract Factory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。 具体工厂(Concrete Factory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。,抽象产品(Abstract Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。 具体产品(Concrete Product)角色:抽象工厂模式所创建的任何产品对象都是某

14、一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。,在什么情形下使用抽象工厂模式:,希望一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节时,即希望一个系统只是知道产品的接口,而不关心实现的时候。 一个系统有多于一个的产品族,而系统只消费其中某一产品族,AbstractFactory模式和Factory模式的区别,AbstractFactory模式是为创建一组(有多类)相关或依赖的对象提供创建接口。 Factory模式是为一类对象提供创建接口,从“开放封闭”原则谈优缺点,“开放封闭”原则要求系统对扩展开放,对修改封闭。通过扩展达到增强其功能的目的。对于

15、涉及到多个产品族与多个产品等级结构的系统,其功能增加包括两方面: 增加产品族:Abstract Factory很好的支持了“开放封闭“原则。 增加新产品的等级结构:需要修改所有的工厂角色,没有很好支持“开放封闭”原则。 分离接口和实现,使得客户端从具体的产品实例中解耦 综合起来,抽象工厂模式以一种倾斜的方式支持增加新的产品,它为新产品族的增加提供方便,而不能为新的产品等级结构的增加提供这样的方便。,本质,选择产品簇的实现,用简单工厂来改进抽象工厂,去除IFactory、SqlserverFactory和AccessFactory三个工厂类,取而代之的是DataAccess类,用一个简单工厂模式来实现,代码结构图,DataAccess类,class DataAccess private static readonly string db = “Sqlserver“; / private static readonly string db = “Access“; public static IUser CreateUser() IUser result = null; switch (db) case “Sqlserver“: result = new SqlserverUser(); break; case “Access“: result = n

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 其它中学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号