设计模式-工厂方法模式
2017-08-19 21:26
141 查看
场景描述:
假设现在有一个User类(如下),原本设计程序使用SqlServer访问,现在因为客户需求的变化,需要使用Access来访问。
对于这种场景,单纯的去修改访问数据库代码,把SqlServer的访问类,修改成Access的访问类,不仅会出现很多问题,因为两种数据库查询语句本身就有区别,最重要的是扩展性非常差,万一以后需要改成用MySql来访问,又是一通改。所以这里用到了工厂方法模式。
首先定义一个User对象接口
然后是两种数据库实现的User对象,都继承于IUser接口
定义一个工厂接口
具体的工厂,根据不同的需求,产生不同的User对象
客户端实现
UML 类图
工厂方法模式
工厂方法模式是简单工厂模式的延伸,首先定义一个用于创建对象的接口,然后产生子类,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
工厂方法模式实现时,客户端需要决定实例化哪一个具体工厂,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行,你想要加功能,本来是改工厂类的,而现在是修改客户端。
工厂方法模式的优缺点
优点:客服了简单工厂违背开放-封闭的原则,又保持了封装对象创建过程的优点。
缺点:每加增加一个产品,就要增加具体的产品工厂类,加大了开发量
本文根据《大话设计模式》整理得出
假设现在有一个User类(如下),原本设计程序使用SqlServer访问,现在因为客户需求的变化,需要使用Access来访问。
public class User { private int id; private string name; public int ID { get { return id; } set { id = value; } } public string Name { get { return name; } set { name = value; } } }
对于这种场景,单纯的去修改访问数据库代码,把SqlServer的访问类,修改成Access的访问类,不仅会出现很多问题,因为两种数据库查询语句本身就有区别,最重要的是扩展性非常差,万一以后需要改成用MySql来访问,又是一通改。所以这里用到了工厂方法模式。
首先定义一个User对象接口
//User对象接口类 public interface IUser { //业务逻辑 void Insert(User user); User GetUser(int i); }
然后是两种数据库实现的User对象,都继承于IUser接口
//Sql数据库User对象 public class SqlUser : IUser { public void Insert(User user) { Console.WriteLine("InsertSqlUser"); } public User GetUser(int i) { Console.WriteLine("SqlUserList"); return null; } } //Access数据库User对象 public class AccessUser : IUser { public void Insert(User user) { Console.WriteLine("InsertAccessUser"); } public User GetUser(int i) { Console.WriteLine("AccessUserList"); return null; } }
定义一个工厂接口
//工厂接口 interface IFactory { //继承类可以根据不同的需求产生不同的User对象 IUser CreateUser(); }
具体的工厂,根据不同的需求,产生不同的User对象
//Sql数据库工厂 public class SqlFactory : IFactory { //访问Sql数据库的User对象 public IUser CreateUser() { return new SqlUser(); } } //Access数据库工厂 public class AccessFactory : IFactory { //访问Access数据库的User对象 public IUser CreateUser() { return new AccessUser(); } }
客户端实现
public static void Main(string[] args) { User user = new User(); //根据不同需求实例化不同数据库的工厂对象 IFactory factory = new AccessFactory(); //完成业务逻辑和数据库访问的解耦,iu对象不必知道具体产生的是哪个数据库的对象 IUser iu = factory.CreateUser(); iu.Insert(user); iu.GetUser(1); }
UML 类图
工厂方法模式
工厂方法模式是简单工厂模式的延伸,首先定义一个用于创建对象的接口,然后产生子类,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
工厂方法模式实现时,客户端需要决定实例化哪一个具体工厂,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行,你想要加功能,本来是改工厂类的,而现在是修改客户端。
工厂方法模式的优缺点
优点:客服了简单工厂违背开放-封闭的原则,又保持了封装对象创建过程的优点。
缺点:每加增加一个产品,就要增加具体的产品工厂类,加大了开发量
本文根据《大话设计模式》整理得出
相关文章推荐
- 设计模式—工厂方法模式
- 设计模式之工厂方法模式
- C#设计模式(3)-工厂方法模式
- 设计模式------工厂方法模式
- 【Unity3D与23种设计模式】工厂方法模式(Factory Method)
- PHP和golang实现设计模式-工厂方法模式
- 设计模式-工厂方法模式
- 设计模式 - 工厂方法模式(Factory Method)
- .NET设计模式:工厂方法模式(Factory Method)BY Terrylee
- 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)
- 设计模式之工厂方法模式
- 研磨设计模式之 工厂方法模式-2
- 转--设计模式之多个工厂方法模式,静态方法模式
- 设计模式入门学习之工厂模式(工厂方法模式)
- 设计模式------工厂方法模式
- 设计模式学习--工厂方法模式
- C#设计模式01-工厂方法模式(附源码)
- 设计模式笔记--工厂方法模式
- 【设计模式学习】工厂方法模式
- 设计模式之02工厂方法模式(笔记)