.Net Framework源代码中的模式之Abstract Factory(抽象工厂模式)

  提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

  以.NET Framework 2.0 System.Data中类为例。

  通过使用DbProviderFactory,只需要修改配置文件,就可以实现不同数据库访问的目的。

System.Data.Common.DbProviderFactory

public abstract class DbProviderFactory

{    public virtual DbConnection CreateConnection()   {      return null;   }    public virtual DbCommand CreateCommand()   {      return null;   } }  System.Data.SqlClient.SqlClientFactory public sealed class SqlClientFactory : DbProviderFactory, IServiceProvider {    public override DbConnection CreateConnection()   {      return new SqlConnection();   }   public override DbCommand CreateCommand()   {     return new SqlCommand();   } }  System.Data.Odbc.OdbcFactory public sealed class OdbcFactory : DbProviderFactory {   public override DbConnection CreateConnection()   {     return new OdbcConnection();   }   public override DbCommand CreateCommand()   {     return new OdbcCommand();   }}  System.Data.Common.DbConnection public abstract class DbConnection : Component, IDbConnection { }  System.Data.SqlClient.SqlConnection public sealed partial class SqlConnection : DbConnection, ICloneable { }  System.Data.Odbc.OdbcConnection public sealed partial class OdbcConnection : DbConnection, ICloneable { } System.Data.Common.DbCommand public abstract class DbCommand : Component, IDbCommand { }  System.Data.SqlClient.SqlCommand public sealed class SqlCommand : DbCommand, ICloneable { } System.Data.Odbc.OdbcCommand public sealed class OdbcCommand : DbCommand, ICloneable { }
public class Client

{

public static void Main()

{     string connectionString = System.Configuration.ConfigurationManager.AppSettings["DB_CONNECTION_STRING"];     string providerName = System.Configuration.ConfigurationManager.AppSettings["DB_PROVIDER_NAME"];    DbProviderFactory factory = DbProviderFactories.GetFactory(providerName);     DbConnection connection = factory.CreateConnection();     connection.ConnectionString = connectionString;     using (connection)     {       DbCommand command = factory.CreateCommand();      command.CommandText = "INSERT INTO t_users(user_username, user_password) VALUES('admin' ,'admin))";       command.Connection = connection;       command.ExecuteNonQuery();     }   } }

  抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的类. 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在着更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合,这就是我们要说的抽象工厂模式。提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

  Abstract Factory模式的特点:

分离了具体的类。抽象工厂模式帮助你控制一个应用创建的对象的类,因为一个工厂封装创建产品对象的责任和过程。它将客户和类的实现分离,客户通过他们的抽象接口操纵实例,产品的类名也在具体工厂的实现中被分离,它们不出现在客户代码中。它使得易于交换产品系列。一个具体工厂类在一个应用中仅出现一次——即在它初始化的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同的产品配置,这是因为一个抽象工厂创建了一个完整的产品系列,
所以整个产品系列会立刻改变。它有利于产品的一致性。当一个系列的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要,而抽象工厂很容易实现这一点。难以支持新种类的产品。难以扩展抽象工厂以生产新种类的产品。这
是因为抽象工厂几口确定了可以被创建的产品集合,支持新种类的产品就需要扩展该工厂接口,这将涉及抽象工厂类及其所有子类的改变。

  在以下情况下应当考虑使用抽象工厂模式:

一个系统不应当依赖于产品类实
例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。 这个系统有多
于一个的产品族,而系统只消费其中某一产品族。 同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中
体现出来。 系统提供一个产品类的库,所
有的产品以
同样的接口出现,从而使客户端不依赖于实现。

时间: 2024-09-20 12:34:26

.Net Framework源代码中的模式之Abstract Factory(抽象工厂模式)的相关文章

DotNet Framework源代码中的模式(四) Abstract Factory(抽象工厂模式)

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 以.NET Framework 2.0 System.Data中类为例

设计模式学习笔记(五)—Abstract Factory抽象工厂模式

GOF<设计模式>一书对Abstract Factory模式是这样描述的: 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类. 大致意思是说:我们在创建这些对象的时候,并不需要指定它们的具体类,这些具体类的对象是由工厂对象负责实例化的.下面是<Design Patterns Explained>一书的例子,有关计算机系统的显示和打印程序,用来显示和打印的分辨率取决于当前运行的系统.低端机使用低分辨率的显示和打印驱动程序,高端机使用高分辨率的显示和打印驱动程序.其

Abstract Factory抽象工厂设计模式

简单工厂模式虽然实现了使对象的创建与使用进行分离,但一次只能创建一个对象.它不能实现一次创建一系列相互依赖对象的需求,为此我们需要学习抽象工厂模式. 抽象工厂:主要功能是生产抽象产品:如:生产学员.管理员等抽象产品. 抽象产品:主要功能是提供实体产品访问接口:如:提供学员.管理员等实体产品数据访问的接口. 实体工厂:主要功能是生产实体产品:如:SQL Server和Access形式的学员.管理员等数据访问对象. 实体产品:主要功能是实现自己的功能:如:分别实现不同的数据库访问. 对 MyScho

PHP实现设计模式中的抽象工厂模式详解_php技巧

抽象工厂模式(Abstact Factory)是一种常见的软件设计模式.该模式为一个产品族提供了统一的创建接口.当需要这个产品族的某一系列的时候,可以为此系列的产品族创建一个 具体的工厂类. [意图] 抽象工厂模式提供一个创建一系统相关或相互依赖对象的接口,而无需指定它们具体的类[GOF95] [抽象工厂模式结构图] [抽象工厂模式中主要角色] 抽象工厂(Abstract Factory)角色:它声明一个创建抽象产品对象的接口.通常以接口或抽象类实现,所有的具体工厂类必须实现这个接口或继承这个类

实例解析Java单例模式编程中对抽象工厂模式的运用_java

定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 类型:创建类模式 类图: 抽象工厂模式与工厂方法模式的区别        抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象.他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式则是针对的多个产品等级结构.在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的

解析iOS应用开发中对设计模式中的抽象工厂模式的实现_IOS

概述抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广. 假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产品等级结构.那么为了将消费这些产品对象的责任和创建这些产品对象的责任分割开来,可以引进抽象工厂模式.这样的话,消费产品的一方不需要直接参与产品的创建工作,而只需要向一个公用的工厂接口请求所需要的产品. 通过使用抽象工厂模式,可以处理具有相同(或者相似)等级结构中的多个产品族中的产品对象的创建问题.如下图所示: 根据产品角色的结构图,就不难给出工厂角色的结构设计图. 可以看

设计模式——2抽象工厂模式(Abstract Factory)

2.抽象工厂模式(Abstract Factory)工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码. 请看例子:[java] view plaincopy public interface Sender { public void Send(); } 两个实现类: [jav

抽象工厂模式

又碰到好文章了,忍不住就想转,这种风格幽默清新的文章很有借鉴意义.转自:http://www.cnblogs.com/cbf4life/archive/2009/12/23/1630612.html 抽象工厂模式 9.1 女娲的失误      我们在上一章节讲了女娲造人的故事.人是造出来了,世界也热闹了,可是低头一看,都是清一色的类型,缺少关爱.仇恨.喜怒哀乐等情绪,人类的生命太平淡了,女娲一想,猛然一拍脑袋,哇K!忘记给人类定义性别了,那怎么办?抹掉重来,于是人类经过一次大洗礼,所有的人种都消

创建型模式--抽象工厂模式

工厂三兄弟之抽象工厂模式(一) 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中 存在大量的工厂类,势必会增加系统的开销.此时,我们可以考虑将一些相关的产品组成一个"产品族",由同一个工厂来统一生产,这就是我们本文将要学习的抽 象工厂模式的基本思想. 界面皮肤库的初始设计 Sunny 软件公司欲开发一套界面皮肤库,可以对 Java 桌面软件进行界面美化.为了保护版权,该皮肤库源代码不打算公开,而只

设计模式系列之三:抽象工厂模式

前言 在设计模式有三个模式是与工厂模式相关的,分别是:简单工厂模式.工厂方法模式以及抽象工厂模式.在前面的文章中已经谈到前面两种,这里就对抽象工厂模式介绍一下.抽象工厂模式就是提供一个创建一系列相关或者相互依赖的接口(也就是抽象类),而无需指定具体的类.简单来说,就是当我们需要创建一个具体的对象的时候,我们不必指定该具体的对象,只需要使用它的上层接口直接调用就行.好像还是很抽象哦,好吧,为了更清晰领悟这个设计模式,我们还是通过一个案例来说明 问题背景 某公司开发了一个A软件,数据库使用的是SQL