(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 抽象工厂模式
提供一个创建一些列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂顾名思义就是对工厂的抽象,它提供了一组创建抽象产品对象的操作接口,我们实际使用的是抽象工厂的派生类,派生类中提供了操作的具 ...
随机推荐
- Sublime Text3 中文汉化
首先安装Package Control,如果已经安装过可以跳过此步骤.可以按照官网这里https://packagecontrol.io/installation 复制命令或者直接复制下面: impo ...
- iMx280A测试声纹
1.首先要有声纹识别的动态库,且arm-linux-gcc的版本相同.可以在虚拟机用file 命令来看文件的基本信息,通过file指令,我们得以辨 识该文件的类型. 2.用tftp将库传到开发板的li ...
- C#winfrom中splitContainer的用法
常用属性 (1).splitContainer不能被鼠标直接点击选中,可通过右击->选择splitContainer选中. (2).属性IsSplitterFixed用于设置拆分器能否移动. ( ...
- ②springMVC入门
1 1.1 需求 以案例作为驱动. springmvc和mybaits使用一个案例(商品订单管理). 功能需求:商品列表查询 1.2 环境准备 数据库环境:mysql5.1
- web项目中 集合Spring&使用junit4测试Spring
web项目中 集合Spring 问题: 如果将 ApplicationContext applicationContext = new ClassPathXmlApplicationContext(& ...
- RESTful 架构理解
REST中的关键词: 1.资源 2.资源的表述 3.状态转移 资源: "资源",可以是一段文本.一张图片.一首歌曲.一种操作.你可以用一个URI(统一资源定位符)指向它,每种资源对 ...
- synchronized的使用方法
[转自] http://blog.csdn.net/witsmakemen/article/details/6966116 记下来,很重要. Java语言的关键字,当它用来修饰一个方法或者一个代码块的 ...
- MyBatis-Generator 最佳实践
为数据库中的表A生成A.java, A.java, A.xml 由于该插件生成的A.java, A.xml会带有example, 不希望生成example 数据库中的字段写有注释, 希望注释能自动生成 ...
- JS性能消耗在哪里?
内部原因:构造,递归,循环,拷贝,动态执行,字符串操作等 1.过度的封装(过多的创建“庞大的”对象,但是如果在允许的条件下,面向对象的封装是可以提高维护性,而且符合我们的高内聚低耦合原则): 2. ...
- eclipse如何修改dynamic web module version
eclipse如何修改dynamic web module version 一.修改工程属性: 右键eclipse的工程,选择属性,再选择Project Facets里面中选择Dynamic Web ...