设计模式:抽象工厂模式(Abstract Factory)
定 义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
结构图:

示例结构图:

实体类:
class User
{
public int Id { get; set; }
public string Name { get; set; }
} class Department
{
public int Id { get; set; }
public string Name { get; set; }
}
数据访问接口:
interface IUser
{
void Insert(User user); User GetUser(int id);
} interface IDepartment
{
void Insert(Department department); Department GetDepartment(int id);
}
User数据库访问具体类:
class SqlServerUser : IUser
{
public void Insert(User user)
{
Console.WriteLine("向SqlServer数据库中User表添加新用户");
} public User GetUser(int id)
{
Console.WriteLine("根据用户Id从SqlServer数据库中获取User");
return null;
}
} class AccessUser : IUser
{
public void Insert(User user)
{
Console.WriteLine("向Access数据库中User表添加新用户");
} public User GetUser(int id)
{
Console.WriteLine("根据Id从Access数据库中获取User");
return null;
}
}
Department数据库访问具体类:
class SqlServerDepartment : IDepartment
{
public void Insert(Department department)
{
Console.WriteLine("向SqlServer数据库Department表中添加一条新记录");
} public Department GetDepartment(int id)
{
Console.WriteLine("根据Id从SqlServer数据库Department表中部门信息");
return null;
}
} class AccessDepartment : IDepartment
{
public void Insert(Department department)
{
Console.WriteLine("向Access数据库Department表中添加一条新记录");
} public Department GetDepartment(int id)
{
Console.WriteLine("根据Id从Access数据库Department表中获得部门信息"); return null;
}
}
抽象工厂接口:
interface IFactory
{
IUser CreateUser(); IDepartment CreateDepartment();
}
SqlServerFactory类:
class SqlServerFactory : IFactory
{
public IUser CreateUser()
{
return new SqlServerUser();
} public IDepartment CreateDepartment()
{
return new SqlServerDepartment();
}
}
AccessFactory类:
class AccessFactory : IFactory
{
public IUser CreateUser()
{
return new AccessUser();
} public IDepartment CreateDepartment()
{
return new AccessDepartment();
}
}
客户端代码:
User user = new User();
Department department=new Department (); IFactory factory = new SqlServerFactory();
IUser iu = factory.CreateUser();
IDepartment idepart = factory.CreateDepartment(); iu.Insert(user);
iu.GetUser(); idepart.Insert(department);
idepart.GetDepartment();
工厂方法模式和抽象工厂模式区别:

反射+配置文件方式修改以上示例:
结构图:

配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="DBType" value="SqlServer"/>
</appSettings>
</configuration>
DataAccess类:
class DataAccess
{
//程序集名称
private static readonly string AssemblyName = "DesignPatternControl";
//数据库类型
private static readonly string db = ConfigurationManager.AppSettings["DBType"]; public static IUser CreateUser()
{
string className = AssemblyName + "." + db + "User"; //具体数据库访问类名称
return (IUser)Assembly.Load(AssemblyName).CreateInstance(className);
} public static IDepartment CreateDepartment()
{
string className = AssemblyName + "." + db + "Department"; //具体数据库访问类名称
return (IDepartment)Assembly.Load(AssemblyName).CreateInstance(className);
}
}
客户端调用:
//反射+抽象方法
User user = new User();
Department department = new Department(); IUser iu = DataAccess.CreateUser();
iu.Insert(user);
iu.GetUser(); IDepartment id = DataAccess.CreateDepartment();
id.Insert(department);
id.GetDepartment();
设计模式:抽象工厂模式(Abstract Factory)的更多相关文章
- 设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释
抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2709 ...
- C#设计模式——抽象工厂模式(Abstract Factory Pattern)
一.概述在软件开发中,常常会需要创建一系列相互依赖的对象,同时,由于需求的变化,往往存在较多系列对象的创建工作.如果采用常规的创建方法(new),会造成客户程序和对象创建工作的紧耦合.对此,抽象工厂模 ...
- Objective-C设计模式——抽象工厂模式Abstract Factory(对象创建)
抽象工厂模式 理解了工厂方法模式,其实抽象工厂和工厂方法模式有很多的相似之处.抽象工厂同样是分离客户端对象的创建和逻辑代码的,但是抽象工厂往往是产生一组数据而不单单是产生一个产品. 抽象工厂提供一个创 ...
- 大话设计模式--抽象工厂模式 Abstract Factory -- C++实现实例
1. 抽象工厂模式: 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的类. 下面是工厂方法模式: 下面是抽象工厂模式: 和工厂方法模式相比 抽象工厂模式可以有多个Product抽象, ...
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...
- 【设计模式】抽象工厂模式 Abstract Factory Pattern
简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...
- .NET设计模式(2):1.2 抽象工厂模式(Abstract Factory)
概述 抽象工厂模式(Abstract Factory)是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口 ...
- 二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...
- 【UE4 设计模式】抽象工厂模式 Abstract Factory Pattern
概述 描述 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类:具体的工厂负责实现具体的产品实例 抽象工厂中每个工厂可以创建多种产品(如苹果公司生产iPhone.iPad): 工厂方法 ...
- 抽象工厂模式(Abstract Factory)C#实例
抽象工厂模式(Abstract Factory)C#实例 本文出处http://www.dofactory.com/net/abstract-factory-design-pattern 一.场景描述 ...
随机推荐
- LightOJ1013 Love Calculator(DP)
容易猜测到包含s1.s2序列的串的最短长度是LCS(s1,s2) + ( len(s1) - LCS(s1,s2) ) + ( len(s2) - LCS(s1,s2) ) ,即: len(s1)+l ...
- Extjs3.3 + swfUpload2.2 实现多文件上传组件
[该上传组件已经停止更新,该上传组件已经在项目中使用.在使用过程中如果发现bug请大家回复此贴.2011-02-27] 主要是为了用swfUpload实现上传,为了新鲜好玩. 理解swfUpload可 ...
- BZOJ3825 : [Usaco2014 Nov]Marathon
不跳过任何点的路程=dis(l,l+1)+dis(l+1,l+2)+...+dis(r-2,r-1)+dis(r-1,r) 要跳过一个点i,则要最小化dis(i,i+2)-dis(i,i+1)-dis ...
- POJ 1947 (树形DP+背包)
题目链接: http://poj.org/problem?id=1947 题目大意:树中各点都由一条边连接.问要弄出个含有m个点的(子)树,至少需要截去多少条边. 解题思路: 设dp[i][j]为i总 ...
- iScroll5 API速查随记
版本 针对iScroll的优化.为了达到更高的性能,iScroll分为了多个版本.你可以选择最适合你的版本.目前我们有以下版本: iscroll.js,这个版本是常规应用的脚本.它包含大多数常用的功能 ...
- 一些比较实用的javascript方法收集,留着有用
动态加载javascript文件 <script type="text/javascript"> //<!-- /*动态加载方法*/ function loadS ...
- Splay 伸展树
废话不说,有篇论文可供参考:杨思雨:<伸展树的基本操作与应用> Splay的好处可以快速分裂和合并. ===============================14.07.26更新== ...
- HDU 4057 Rescue the Rabbit(AC自动机+DP)
题目链接 一个数组开小了一点点,一直提示wa,郁闷,这题比上个题简单一点. #include <iostream> #include <cstring> #include &l ...
- Highcharts 本地导出图片 Java
下载的Highcharts-2.3.5.zip 解压后 有 E:\Highcharts\Highcharts-2.3.5\exporting-server\java 目录 提供了Java实现的导出应用 ...
- JBPM4.4学习API
一.流程引擎API org.jbpm.api.ProcessEngine是jbpm4所有的Service API 之源. 既所有的Service API(服务接口)都从ProcessEngine中获取 ...