Net设计模式实例之抽象工厂模式(Abstract Factory Pattern)

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:

一、抽象工厂模式简介(Bref Introduction

抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类。优点是:易于交换产品系列,由于具体工厂类在一个应该用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂类变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。抽象工厂的另一个优点是,它让具体的创建实例与客户端分离,客户端是通过他们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户的代码中。

二、解决的问题(What To Solve

       常用用于解决数据访问程序,也就是说程序通过使用抽象工厂模式后,可以灵活地在不同的数据库之间切换,而不需要费时费力地改变原有程序。

三、抽象工厂模式分析(Analysis

1、抽象工厂模式结构

 

IProductAIProductA接口:两个产品接口,他们都有可能有两种不同的实现。

ProductA1ProductA2ProductB1ProductB2具体实现类:对两个产品接口的具体分类的实现。

AbstractFactory抽象类:抽象工厂接口,它里面应该包含所有产品创建的抽象方法。

ConcreteFactory1ConcreteFactory2具体工厂类:创建具有特定实现的产品对象

2、源代码

1、产品接口IProductAIProductB及其两种实现

public interface IProductA

{

    void Show();

}

 

public class ProductA1 : IProductA

{

    public void Show()

    {

        Console.WriteLine("具体产品类{0}展示方法。",this.GetType().Name);

    }

}

 

public class ProductA2 : IProductA

{

    public void Show()

    {

        Console.WriteLine("具体产品类{0}展示方法。"this.GetType().Name);

    }

}

 

public interface IProductB

{

    void Insert();

}

 

public class ProductB1 : IProductB

{

    public void Insert()

    {

        Console.WriteLine("具体产品类{0}插入方法。"this.GetType().Name);

    }

}

 

public class ProductB2 : IProductB

{

    public void Insert()

    {

        Console.WriteLine("具体产品类{0}插入方法。"this.GetType().Name);

    }

}

 

2抽象工厂接口AbstractFactory,及其具体的工厂AbstractFactory1AbstractFactory2

public abstract class AbstractFactory

{

    public abstract IProductA CreateProductA();

    public abstract IProductB CreateProductB();

}

 

public class AbstractFactory1:AbstractFactory

{

 

    public override IProductA CreateProductA()

    {

        IProductA productA1 = new ProductA1();

        return productA1;

    }

 

    public override IProductB CreateProductB()

    {

        IProductB productB1 = new ProductB1();

        return productB1;

    }

}

 

public class AbstractFactory2 : AbstractFactory

{

 

    public override IProductA CreateProductA()

    {

        IProductA productA2 = new ProductA2();

        return productA2;

    }

 

    public override IProductB CreateProductB()

    {

        IProductB productB2 = new ProductB2();

        return productB2;

    }

}

 

3、客户端代码

static void  Main (string[] args)

{

    //根据需求调用具体工厂AbstractFactory1

    AbstractFactory factory1 = new AbstractFactory1();

    IProductA productA1 = factory1.CreateProductA();

    IProductB productB1 = factory1.CreateProductB();

    productA1.Show();

    productB1.Insert();

    Console.WriteLine("\n");

    //根据需求调用具体工厂AbstractFactory2

    AbstractFactory factory2 = new AbstractFactory2();

    IProductA productA2 = factory2.CreateProductA();

    IProductB productB2 = factory2.CreateProductB();

    productA2.Show();

    productB2.Insert();

 

    Console.ReadKey();

}

3、程序运行结果

四.案例分析(Example

1、场景

使用抽象工厂+反射+配置文件实现数据访问层程序。结构如下图所示

 

用反射+抽象工厂+配置文件的数据访问程序。

Assembly.Load("程序集名称").CreateInstance("命名空间.类名称")。比如:

IProduct product=(IProduct)Assembly.Load("抽象工程模式").CreateInstance("抽象工程模式.SqlServerProduct")

常用做法是:

Private static readonly string AssemblyName="抽象工程模式";

Private static readonly string DB=ConfiurationManager.AppSettings["db"];

配置文件如下:

<configuration>

    <appSettings>

         <add key="db" value="Sqlserver"/>

    <appSettings>

<configuration>

通过读配置文件给DB字符赋值,在配置文件中写明当前使用的是SqlServer 还是Access数据库。反射+抽象工厂+配置文件解决方案解决了数据访问时的可维护、可扩展问题

 

2、代码

1、对象UerProduct及其相对应的操作

public interface IUser

{

    void Insert();

}

 

public class SqlServerUser:IUser

{

    public void Insert()

    {

        Console.WriteLine("{0}插入用户.",this.GetType().Name);

    }

}

 

public class AccessUser : IUser

{

    public void Insert()

    {

        Console.WriteLine("{0}插入用户."this.GetType().Name);

    }

}

 

public interface IProduct

{

    void GetProduct();

}

 

public class SqlServerProduct : IProduct

{

    public void GetProduct()

    {

        Console.WriteLine("{0}查询商品."this.GetType().Name);

    }

}

 

public class AccessProduct : IProduct

{

    public void GetProduct()

    {

        Console.WriteLine("{0}查询商品."this.GetType().Name);

    }

}

 

2、数据访问类DataAccess

public class DataAccess

{

    private static readonly string AssemblyName ="AbstractFactoryReflection";

    private static readonly string db = "SqlServer";

 

    public static IUser CreateUser()

    {

        string className = AssemblyName + "." + db + "User";

        IUser user = (IUser)Assembly.Load(AssemblyName).CreateInstance(className);

        return user;

    }

 

    public static IProduct CreateProduct()

    {

        string className = AssemblyName + "." + db + "Product";

        return(IProduct)Assembly.Load(AssemblyName).CreateInstance(className);

    }

}

 

3、客户端代码

static void  Main (string[] args)

{

    IUser user = DataAccess.CreateUser();

    user.Insert();

 

    IProduct product = DataAccess.CreateProduct();

    product.GetProduct();

 

    Console.ReadKey();

}

 

五、总结(Summary

抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类。抽象工厂模式的典型应用就是,使用抽象工厂+反射+配置文件实现数据访问层程序。

 


         本文转自灵动生活博客园博客,原文链接:http://www.cnblogs.com/ywqu/archive/2010/01/08/1641825.html ,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
7月前
|
设计模式 Java
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
|
3月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
3月前
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
6月前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
7月前
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
|
7月前
|
设计模式
设计模式之工厂 Factory
设计模式之工厂 Factory
57 1
|
7月前
|
设计模式
设计模式(二)工厂方法模式(Factory Method)
设计模式(二)工厂方法模式(Factory Method)
35 0
|
28天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
3月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
1月前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###