(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 抽象工厂模式
提供一个创建一些列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂顾名思义就是对工厂的抽象,它提供了一组创建抽象产品对象的操作接口,我们实际使用的是抽象工厂的派生类,派生类中提供了操作的具 ...
随机推荐
- 给Android程序员的六个建议
给Android程序员的六个建议 分类: 安卓相关2015-07-14 23:58 177人阅读 评论(0) 收藏 举报 android程序员 如果你一年前写的代码 , 在现在看来你还感觉写的很不错 ...
- ExtJS笔记3 MVC Architecture
MVC Architecture MVC架构 Contents File Structure Creating the application in app.js Defining a Contr ...
- <?php set_time_limit(10);
<?php include('w_fun.php'); set_time_limit(10); Fatal error: Maximum execution time of 10 seconds ...
- Python文件方法
打开文件 使用open函数,语法格式为:open( name[, mode[, buffering]]),name为打开文件名,mode为打开文件方式,buffering控制文件的缓冲. mode可选 ...
- ubuntu中一些配置文件含义
/var/log/apache2/mod_jk.log apache2 mod_jk错误日志错误 /conf/server.xml ...
- perl常用代码
字符串联结和重复操作符 联接: . 重复:x 联接且赋值(类似+=): .=例: $newstring = "potato" . "head"; $ ...
- C# .Net实现URL绝对路径和相对路径之间互相转换
网站制作开发中,URL的绝对路径和相对路径之间互相转换,是经常需要用到的.以下是在C#.Net下一种实现二者互相转化的方法: [DllImport("shlwapi.dll", C ...
- 在Vista或更高版本Windows系统中, 获取超大图标的办法
这几天写个小东西, 需要获取系统正在运行的程序图标, 一般来说32*32就足够了, 不过既然Win7能够支持超大图标(256*256), 咱们也需要与时俱进, 说不定什么时候遇到个变态客户就有这要求了 ...
- java中计算两个日期之间天数的程序设计。
//用java编写出一个以下方法计算两个日期之间天数的程序设计. import java.util.regex.Matcher; import java.util.regex.Pattern; pub ...
- windows下安装和配置mongoDB
上次在mac下安装和配置了mongodb,这次在windows下也尝试安装和配置mongodb. 1.首先下载mongodb压缩包,下载后解压到D盘或E盘.如下: 2.配置环境变量:桌面—计算机右键— ...