您的位置:首页 > 其它

设计模式-工厂方法模式

2017-08-19 21:26 141 查看
场景描述:

假设现在有一个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 类图



工厂方法模式

工厂方法模式是简单工厂模式的延伸,首先定义一个用于创建对象的接口,然后产生子类,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。

工厂方法模式实现时,客户端需要决定实例化哪一个具体工厂,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行,你想要加功能,本来是改工厂类的,而现在是修改客户端。

工厂方法模式的优缺点

优点:客服了简单工厂违背开放-封闭的原则,又保持了封装对象创建过程的优点。
缺点:每加增加一个产品,就要增加具体的产品工厂类,加大了开发量

本文根据《大话设计模式》整理得出
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: