【背景】
设计模式是非常重要的一块知识,每个设计模式都值得深入了解和学习。
【内容】
工厂方法设计模式总结:一、定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
二、UML结构图:
三、代码实现:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 抽象工厂模式
{
class Program
{
static void Main(string[] args)
{
User user = new User();
Department dept = new Department();
IUser iu = DataAccess.CreateUser();//直接得到实际的数据访问实例,而不存在任何依赖。
iu.Insert(user);
iu.GetUser(1);
IDepartment id = DataAccess.CreateDepartment();//直接得到实际的数据库访问实例,而不存在任何依赖。
id.Insert(dept);
id.GetDepartment(1);
Console.Read();
}
}
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 Insert(User user);
User GetUser(int id);
}
//SQLserver类,用于访问SQL Sever的User
class SqlserverUser : IUser
{
public void Insert(User user)
{
Console.WriteLine("在SQL Server中给User表添加一条记录");
}
public User GetUser(int id)
{
Console.WriteLine("在SQL Server中根据ID得到User表一条记录");
return null;
}
}
//AccessUser类,用于访问Access的User
class AccessUser:IUser
{
public void Insert(User user)
{
Console.WriteLine("在Access中给User表添加一条记录");
}
public User GetUser(int id)
{
Console.WriteLine("在Access中根据ID得到User表一条记录");
return null;
}
}
//IFactory接口,定义一个创建访问User表对象的抽象的工程接口
interface IFactory
{
IUser CreateUser();
IDepartment CreateDepartment();
}
//增加了部门表(Department)
class Department
{
private int _id;
public int ID
{
get {return _id;}
set {_id =value;}
}
private string _deptName;
public string DeptName
{
get {return _deptName;}
set {_deptName =value;}
}
}
//IDepartment接口,用于客户端访问,解除与具体数据库访问的耦合。
interface IDepartment
{
void Insert(Department department);
Department GetDepartment(int id);
}
//SQLserverDepartment类,用于访问SQL Server的Department
class SqlserverDepartment:IDepartment
{
public void Insert(Department department)
{
Console.WriteLine("在SQL Server中给Department表增加一条记录");
}
public Department GetDepartment(int id)
{
Console.WriteLine("在SQL server中根据ID得到的Department表一条记录");
return null;
}
}
//AccessDepartment类,用于访问Access的Department
class AccessDepartment:IDepartment
{
public void Insert(Department department)
{
Console.WriteLine("在Access中给Department表增加一条记录");
}
public Department GetDepartment(int id)
{
Console.WriteLine("在Access中根据ID得到Department表一条记录");
return null ;
}
}
//简单工厂对抽象工厂进行了修改,简化了代码,解耦目的实现 。
class DataAccess
{
private static readonly string db="Sqlserver";
//private static readonly string db="Access"//数据库的名称,可以替换成Access,直接显示
public static IUser CreateUser()
{
IUser result=null ;
switch (db)//实例化相应的对象。
{
case "Sqlserver":
result =new SqlserverUser();
break ;
case "Access":
result =new AccessUser();
break ;
}
return result ;
}
public static IDepartment CreateDepartment()
{
IDepartment result=null;
switch (db)
{
case "Sqlserver":
result =new SqlserverDepartment ();
break;
case "Access":
result =new AccessDepartment();
break ;
}
return result ;
}
}
}