(Abstract Factory)抽象工厂
- 定义:
抽象工厂同工厂方法有相似处:都提供了对子类创建的封装,都是有工厂方法的接口实现类的中决定了子类被创建为什么对象。
不同于工厂方法之处:工厂方法创建的对象只是一个类型的子类,而抽象工厂创建的对象为多个类型的不同类。
例如:工厂方法创建与A具有同一性质的子类A1,A2,而抽象工厂确实要负责创建多个类型的类:A1,A2...B1,B2...。
- 应用场景:
当在一个类中出现多个不同类型类的创建时,而且这些不同类都可以抽象出不同的接口,这是就可以考虑抽象工厂。
- 例如:我们系统中有Member,和SupperMember,而Member要求Mmeber1:Member要求保存在Access数据库中,Member2:Member要求保存在SqlServer数据库中;
SupperMember要求SupperMember1:SupperMember存储在Access数据库总,而SupperMember2:SupperMember保存在SqlServer数据库中。
- 分析:
我们可以想到该场景适用于创建类型的模式,而有多个不同创品创建的子类,可以想到工厂方法,但是我们这里SupperMember和Member是两个不同的类型的类,这就是说,我么要创建多个不同类型的子类,这无疑最适合的就是抽象工厂了。
- 实现:
1. 代码结构:
2. 代码:
MemberBO.cs
/// <summary>
/// Description of MemberBO.
/// </summary>
public class MemberBO
{
private MemberDaoBase memberDaoBase = null; public MemberBO(string dbType)
{
if (dbType.ToUpper() == "ACCESS") {
this.memberDaoBase = new MemberAccessDao();
} else if (dbType.ToUpper() == "SQLSERVER") {
this.memberDaoBase = new MemberSqlServerDao();
} else {
throw new ArgumentOutOfRangeException();
}
} public MemberBase CreateMember()
{
return this.memberDaoBase.CreateMember();
} public SupperMemberBase CreateSupperMember()
{
return this.memberDaoBase.CreateSupperMember();
}
}
MemberDaoBase.cs
/// <summary>
/// Description of MemberDaoBase.
/// </summary>
public abstract class MemberDaoBase
{
public abstract MemberBase CreateMember(); public abstract SupperMemberBase CreateSupperMember();
}
MemberAccessDao.cs
/// <summary>
/// Description of MemberAccessDao.
/// </summary>
public class MemberAccessDao:MemberDaoBase
{
public MemberAccessDao()
{
} public override MemberBase CreateMember()
{
Console.WriteLine("create member1 in access db");
return new Member1();
} public override SupperMemberBase CreateSupperMember()
{
Console.WriteLine("create suppermember1 in access db");
return new SupperMember1();
}
}
MemberSqlServerDao.cs
/// <summary>
/// Description of MemberSqlServerDao.
/// </summary>
public class MemberSqlServerDao:MemberDaoBase
{
public MemberSqlServerDao()
{
} public override MemberBase CreateMember()
{
Console.WriteLine("create member2 in sqlserver db");
return new Member2();
} public override SupperMemberBase CreateSupperMember()
{
Console.WriteLine("create suppermember2 in sqlserver db");
return new SupperMember2();
}
}
MemberBase.cs
public abstract class MemberBase
{
public int ID{ get; set; } public string Name{ get; set; }
}
Member1.cs
/// <summary>
/// Description of Member1.
/// </summary>
public class Member1:MemberBase
{
public Member1()
{
}
}
Member2.cs
/// <summary>
/// Description of Member2.
/// </summary>
public class Member2:MemberBase
{
public Member2()
{
}
}
SupperMemberBase.cs
/// <summary>
/// Description of SupperMember.
/// </summary>
public abstract class SupperMemberBase
{
public int ID { get; set; } public string Name { get; set; }
}
SupperMember1.cs
/// <summary>
/// Description of SupperMember1.
/// </summary>
public class SupperMember1:SupperMemberBase
{
public SupperMember1()
{
}
}
SupperMember2.cs
/// <summary>
/// Description of SupperMember2.
/// </summary>
public class SupperMember2:SupperMemberBase
{
public SupperMember2()
{
}
}
3. 调用运行:
class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Hello World!"); MemberBO memberBO=new MemberBO("Access");
memberBO.CreateMember();
memberBO.CreateSupperMember(); memberBO=new MemberBO("SqlServer");
memberBO.CreateMember();
memberBO.CreateSupperMember(); // TODO: Implement Functionality Here Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
4. 输出:
- 优缺点:
优点:推迟了子类的创建,实现多种创建的创建,不在局限于一个类型的产品,更加灵活,对子类的创建进行了封装,代码更有层次,逻辑更加清洗,分工明确;
缺点:封装对性能带来性能影响。
(Abstract Factory)抽象工厂的更多相关文章
- 设计模式02: Abstract Factory 抽象工厂(创建型模式)
Abstract Factory 抽象工厂(创建型模式) 常见的对象创建方法: //创建一个Road对象 Road road=new Road(); new的问题: -实现依赖 ...
- c++ 设计模式9 (Abstract Factory 抽象工厂模式)
5.2 抽象工厂模式 动机:在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作. 代码示例: 实现利用数据库的业务逻辑,支持多数据库(Sq ...
- 设计模式(一): abstract factory抽象工厂模式 -- 创建型模式
1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要 ...
- Abstract Factory 抽象工厂(创建型模式)
1.常规的对象创建方法(以更换QQ空间主题为例) (这里的常规对象指的是由于业务需求,当前实例化的对象有可能被其他相似的对象(有着共同的特性)所取代,例如更换手机铃声:一首歌取代另一首歌(词,曲,和声 ...
- Java设计模式:Abstract Factory(抽象工厂)模式
概念定义 抽象工厂(Abstract Factory)模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式中,系统的产品有多于一个的产品族(一个产品族里定义多个产品) ...
- 一天一个设计模式——Abstract Factory抽象工厂模式
一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂 ...
- 对象创建型模式------Abstract Factory(抽象工厂)
1. 意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.2. 别名 Kit3. 动机 假设我们要开发一款游戏,当然为了吸引更多的人玩,游戏难度不能太大 ...
- Abstract Factory抽象工厂模式
抽象工厂模式是是用一个超级工厂去创建其他工厂,简单点说就是工厂的父类,属于创建型模式. 目标:提供一个创建一组对象的方法,而无需指定它们具体的类(同工厂方法). 使用场景:系统的产品有多于一个的产品族 ...
- 面向对象设计模式纵横谈:Abstract Factory 抽象工厂模式(笔记记录)
今天是设计模式的第二讲,抽象工厂的设计模式,我们还是延续老办法,一步一步的.演变的来讲,先来看看一个对象创建的问题. 1.如何创建一个对象 常规的对象创建方法: 这样的创建对象没有任何问题, ...
- Abstract Factory 抽象工厂模式
提供一个创建一些列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂顾名思义就是对工厂的抽象,它提供了一组创建抽象产品对象的操作接口,我们实际使用的是抽象工厂的派生类,派生类中提供了操作的具 ...
随机推荐
- oracle 多表查询
1.注意点 在查询过程中,不确定数据库表中的数据量,先查询数据量,数据量较大,则不能直接查询(select * from emp),如果数据量较大,直接查询容易造成死机或者数据读取较慢,如果较小可以查 ...
- MBR中“起始磁头/扇区/柱面“同"逻辑区块地址(LBA)"的区别
"起始磁头/扇区/柱面"共有3个字节,最大能表示8G的扇区编号.当硬盘扇区编号多于8G时,此表示法便力不从心,便使用4个字节的LBA表示法(逻辑扇区地址,相对扇区地址). 算是计算 ...
- nginx反向代理初探
1.安装nginx 2.在nginx.conf的http区段中配置负载均衡段 #cluserupstream myCluster{ server 192.168.1.110:1300 weight=5 ...
- php配置相关
php.ini error_reporting //配置错误的显示方式 display_errors //此项优先级高于error_reporting,如果关闭该项,会返还http状态码,如果开启,则 ...
- 小米2/2S 手机由 Smartisan OS ROM 刷回 MIUI 教程
刷机所需文件1.请前往 MIUI 官网下载小米 2/2S 标准版 MIUI ROM 包.下载地址:http://www.miui.com/getrom.php?r=2:下载后请将原文件名修改为“upd ...
- oracle EBS 资产定义
一.资产定义也就是江项目任务上的特定(能生成资产的)物料按照一定格式生成资产信息,其中每个独立物料生成一条资产,具体操作步骤如下: 1.省本部库存超级用户系统内生成领料单.审批领料单.最后进行出库处理 ...
- Archiver 浅析
归档是一个过程,即用某种格式来保存一个或多个对象,以便以后还原这些对象.通常,这个过程包括将(多个)对象写入文件中,以便以后读取该对象. 两种归档数据的方法:属性列表和带键值的编码. 属性列表局限性很 ...
- php--递归调用
- IdTcpClient简单示例
procedure TForm1.btnHttpGetClick(Sender: TObject); begin idtcpclnt1.Host := '192.168.10.88'; idtcpcl ...
- 纯Python包发布setup脚本编写示例
如果你有多个模块需要发布,而它们又存在于多个包中,那么指定整个包比指定模块可能要容易地多.即使你的模块并不在一个包内,这种做法也行的通:你可以告诉Distutils从根包(root package)处 ...