• 定义:

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

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

例如:工厂方法创建与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. unity HideInInspector与SerializeField

    [HideInInspector]表示将原本显示在面板上的序列化值隐藏起来. [SerializeField]表示将原本不会被序列化的私有变量和保护变量可以序列化,这么他们在下次读取时,就是你上次赋值 ...

  2. HTML: Css引入的四種方式

    哪四種?這裏簡單進行下總結 ①寫在 style 標籤中 <style type="text/css"> 這裏是css代碼... </style> ②外部引入 ...

  3. mod_php VS mod_fastcgi

    mod_php VS mod_fastcgi 目录 什么是mod_php和mod_fastcgi 1 工作原理 1 mod_php 2 mod_fastcgi 3 mod_factcgi的三种配置方式 ...

  4. laravel 外键schema RBAC

    $table->bigIncrements('id')  ;   Incrementing ID (primary key) using a " UNSIGNED BIG INTEGE ...

  5. 如何获取DIV的id

    $(obj).attr("id");参数可以是id也可以是其他例如name等属性

  6. Fortran并行计算的一些例子

    以下例子来自https://computing.llnl.gov/tutorials/openMP/exercise.html网站 一.打印线程(Hello world) C************* ...

  7. 一个很好的Delphi博客

    一个很好的Delphi博客,主人叫万一 http://www.cnblogs.com/del/archive/2011/09/21/2183007.html

  8. struct stat结构体的详解和用法

    [cpp] view plaincopy //! 需要包含de头文件 #include <sys/types.h> #include <sys/stat.h> S_ISLNK( ...

  9. 区分总结innerHeight与clientHeight、innerWidth与clientWidth、scrollLeft与pageXOffset等属性

    window对象: (1)innerHeight属性:窗口中文档显示区域的高度,不包括菜单栏.工具栏等部分.该属性可读可写. IE不支持该属性,IE中body元素的clientHeight属性与该属性 ...

  10. centos 重启php-fpm

    centos 重启php-fpm ps -ef | grep php-fpm 查看php-fpm的配置文件,然后从配置文件查看php-fpm的pid文件,然后,  kill -SIGUSR2 `cat ...