• 定义:

抽象工厂同工厂方法有相似处:都提供了对子类创建的封装,都是有工厂方法的接口实现类的中决定了子类被创建为什么对象。

不同于工厂方法之处:工厂方法创建的对象只是一个类型的子类,而抽象工厂创建的对象为多个类型的不同类。

例如:工厂方法创建与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)抽象工厂的更多相关文章

  1. 设计模式02: Abstract Factory 抽象工厂(创建型模式)

    Abstract Factory 抽象工厂(创建型模式) 常见的对象创建方法:    //创建一个Road对象    Road road=new Road();    new的问题:    -实现依赖 ...

  2. c++ 设计模式9 (Abstract Factory 抽象工厂模式)

    5.2 抽象工厂模式 动机:在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作. 代码示例: 实现利用数据库的业务逻辑,支持多数据库(Sq ...

  3. 设计模式(一): abstract factory抽象工厂模式 -- 创建型模式

    1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要 ...

  4. Abstract Factory 抽象工厂(创建型模式)

    1.常规的对象创建方法(以更换QQ空间主题为例) (这里的常规对象指的是由于业务需求,当前实例化的对象有可能被其他相似的对象(有着共同的特性)所取代,例如更换手机铃声:一首歌取代另一首歌(词,曲,和声 ...

  5. Java设计模式:Abstract Factory(抽象工厂)模式

    概念定义 抽象工厂(Abstract Factory)模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式中,系统的产品有多于一个的产品族(一个产品族里定义多个产品) ...

  6. 一天一个设计模式——Abstract Factory抽象工厂模式

    一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂 ...

  7. 对象创建型模式------Abstract Factory(抽象工厂)

    1. 意图    提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.2. 别名    Kit3. 动机        假设我们要开发一款游戏,当然为了吸引更多的人玩,游戏难度不能太大 ...

  8. Abstract Factory抽象工厂模式

    抽象工厂模式是是用一个超级工厂去创建其他工厂,简单点说就是工厂的父类,属于创建型模式. 目标:提供一个创建一组对象的方法,而无需指定它们具体的类(同工厂方法). 使用场景:系统的产品有多于一个的产品族 ...

  9. 面向对象设计模式纵横谈:Abstract Factory 抽象工厂模式(笔记记录)

         今天是设计模式的第二讲,抽象工厂的设计模式,我们还是延续老办法,一步一步的.演变的来讲,先来看看一个对象创建的问题. 1.如何创建一个对象 常规的对象创建方法: 这样的创建对象没有任何问题, ...

  10. Abstract Factory 抽象工厂模式

    提供一个创建一些列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂顾名思义就是对工厂的抽象,它提供了一组创建抽象产品对象的操作接口,我们实际使用的是抽象工厂的派生类,派生类中提供了操作的具 ...

随机推荐

  1. ubuntu&FAQ

        转自-笨小孩 查看进程: ,ps -e 命令 ,feng@feng:~$ sudo netstat -antup Active Internet connections (servers an ...

  2. ecshop lang用法

    ecshop lang用法 分类: ECSHOP2013-08-15 16:17 2184人阅读 评论(0) 收藏 举报 ecshop目录下的languages目录.这个是ecshop语言包所在.ec ...

  3. ThinkPHP 3.2 版本升级了哪些内容

    ThinkPHP 3.2 版本升级了哪些内容           ThinkPHP 3.2发布了挺长时间了,这里也总结下这次ThinkPHP 3.2到底发生了哪些变化,方便程序员们进行开发. 前言 T ...

  4. w win cmd VS broswer

    php -f Fetch data from db , use php without any bugs to analyse the data and read and write db, with ...

  5. Super不要在Super构造器中调用覆盖方法

    import java.util.Date; public class Super{ public Super(){ System."); overrideMe(); System.&quo ...

  6. MYSQL启动报1067错误,系统日志中是“服务 mysql 意外停止” Mysql日志中则是:“Plugin \'FEDERATED\' is disabled”

    MYSQL启动报1067错误,系统日志中是"服务 mysql 意外停止" Mysql日志中则是:"Plugin \'FEDERATED\' is disabled&quo ...

  7. jfinal框架教程-学习笔记(二)

    上一节介绍了jfinal框架的简单搭建,这节通过一个小例子了解jfinal的结构和特点 先上图 1.建数据库(我用的是oracle数据库,其他的相对也差不多) -- Create table crea ...

  8. Java实验报告五:Java网络编程及安全

    Java实验报告五:Java网络编程及安全                                                                               ...

  9. 转:Windows Socket五种I/O模型

    原文转自:  Windows Socket五种I/O模型 Winsock 的I/O操作: 1. 两种I/O模式 阻塞模式:执行I/O操作完成前会一直进行等待,不会将控制权交给程序.套接字 默认为阻塞模 ...

  10. JS懒加载

    4.如何使用js懒加载图片       a.懒加载图片是基于jquery.js的,所以: <script src="jquery.js" type="text/ja ...