设计模式:抽象工厂模式(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 一.场景描述 ...
随机推荐
- 构造 Codeforces Round #302 (Div. 2) B Sea and Islands
题目传送门 /* 题意:在n^n的海洋里是否有k块陆地 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 输出完k个L后,之后全部输出S:) 5 10 的例子可以是这样的: LSLS ...
- HDU 1045 (DFS搜索)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1045 题目大意:在不是X的地方放O,所有O在没有隔板情况下不能对视(横行和数列),问最多可以放多少个 ...
- 编译gcc4.7.3 其他版本的应该也可以
编译它真麻烦啊..耗费了我一下午..我是ubuntu10.10环境的.内置的gcc版本很老了,好像是4.2吧.源里又没有高版本的,于是自己编译了. 准备 下载gcc:点我打开 //源,找个最快的.下你 ...
- 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树套树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1901 这题调了我相当长的时间,1wa1a,我是第一次写树套树,这个是树状数组套splay,在每个区间 ...
- 李洪强-C语言9-C语言的数据,变量和常量
一.数据 图片文字等都是数据,在计算机中以0和1存储. (一)分类 数据分为静态数据和动态数据. ①. 静态数据:一些永久性的的数据,一般存储在硬盘中,只要硬盘没坏数据都是存在的.一般以文件的形式存储 ...
- sizeToFit()使用心得
sizeToFit()使用心得: 很多的初学者,包括我在内,当初在学习的时候,特别纠结什么时候用这个sizeToFit(). 下面我就来分享一下我的一些使用心得. 一.我们先来看看官方文档对sizeT ...
- 查看GCC编译C的中间代码
小测试,记录一下命令 XD 一.C程序源码(code.c): 二.中间代码 由 gcc -fdump-tree-all code.c 得到 查看 code.c.012t.cfg 三.汇编级代码 (64 ...
- [百科] - CreatePen()
CreatePen编辑[声明]HPEN CreatePen(int nPenStyle, int nWidth, COLORREF crColor);[说明]用指定的样式.宽度和颜色创建一个画笔[参数 ...
- hdu Line belt
这道题是一道3分搜索的题.其实这种题很多时候都出现在高中的解析几何上,思路很简单,从图中可以看到,肯定在AB线段和CD线段上各存在一点x和y使得所花时间最少 因为AB和CD上的时间与x和y点的坐标都存 ...
- 初探Bootstrap之十二栅格
模型1: <!-- 4/12 --> <div class="container"> <div class="row"> & ...