C#设计模式(4)-抽象工厂模式
引言
上一篇介绍了设计模式中的工厂方法模式-C#设计模式(3)-工厂方法模式,本篇将介绍抽象工厂模式;
抽象工厂模式简介
抽象工厂模式(AbstractFactory):提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的类;
工厂方法模式是为了克服简单工厂模式的缺点而设计出来的;工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性。但是在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品,如果我们要设计这样的系统时,工厂方法模式显然在这里不适用,然后抽象工厂模式却可以很好地解决一系列产品创建的问题,可以在一个工厂中创建多个产品;
结构图

应用实例
这里实例继续采用上一篇中的实例:现在市面上很多种数据库,Oracle、SqlSever、Mysql等;比如我们现在需要对某个业务实体进行数据操作,新增。更新等,如果现在有用户user 、部门department;如果前期是使用的sqlserver,如果希望达到后期能够平滑切换数据库为oracle,而影响较小;
类图

代码实例
产品
用户User操作
用户接口
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace AbstractFactory
{
/// <summary>
/// 用户
/// </summary>
public interface IUserOpr
{
/// <summary>
/// 新增
/// </summary>
bool Insert(); /// <summary>
/// 更新
/// </summary>
/// <returns></returns>
bool Update();
}
}
oracle操作用户User
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace AbstractFactory
{
/// <summary>
/// oracle操作用户
/// </summary>
public class OracleUserOpr : IUserOpr
{
/// <summary>
/// 新增
/// </summary>
public bool Insert()
{
Console.WriteLine("Oracle新增用户记录");
return true;
} /// <summary>
/// 更新
/// </summary>
/// <returns></returns>
public bool Update()
{
Console.WriteLine("Oracle更新用户记录");
return true;
} }
}
sqlserver操作用户User
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace AbstractFactory
{
/// <summary>
/// sqlServer操作用户
/// </summary>
public class SqlServerUserOpr : IUserOpr
{
/// <summary>
/// 新增
/// </summary>
public bool Insert()
{
Console.WriteLine("SqlServer新增用户记录");
return true;
} /// <summary>
/// 更新
/// </summary>
/// <returns></returns>
public bool Update()
{
Console.WriteLine("SqlServer更新用户记录");
return true;
} }
}
部门Department操作
部门操作接口
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace AbstractFactory
{
/// <summary>
/// 部门操作
/// </summary>
public interface IDepartMentOpr
{
/// <summary>
/// 新增
/// </summary>
bool Insert(); /// <summary>
/// 更新
/// </summary>
/// <returns></returns>
bool Update();
}
}
oracle操作部门Department
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace AbstractFactory
{
/// <summary>
/// oracle操作部门
/// </summary>
public class OracleDepartMentOpr : IDepartMentOpr
{
/// <summary>
/// 新增
/// </summary>
public bool Insert()
{
Console.WriteLine("Oracle新增部门记录");
return true;
} /// <summary>
/// 更新
/// </summary>
/// <returns></returns>
public bool Update()
{
Console.WriteLine("Oracle更新部门记录");
return true;
} }
}
sqlserver操作部门Department
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace AbstractFactory
{
/// <summary>
/// sqlServer操作部门
/// </summary>
public class SqlServerDepartMentOpr : IDepartMentOpr
{
/// <summary>
/// 新增
/// </summary>
public bool Insert()
{
Console.WriteLine("SqlServer新增部门记录");
return true;
} /// <summary>
/// 更新
/// </summary>
/// <returns></returns>
public bool Update()
{
Console.WriteLine("SqlServer更新部门记录");
return true;
} }
}
工厂
这里如果是工厂方法模式将会对用户(sqlserver、oracle)、部门(sqlserver、oracle)分别创建工厂,将会创建四个工厂;
这里使用抽象工厂将产品在一个工厂中创建;
工厂接口
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace AbstractFactory
{
/// <summary>
/// 工厂接口
/// </summary>
public interface IFactory
{
/// <summary>
/// 创建User
/// </summary>
/// <returns></returns>
IUserOpr CreateUser(); /// <summary>
/// 创建部门
/// </summary>
/// <returns></returns>
IDepartMentOpr CreateDepartMent(); }
}
Oracle工厂
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace AbstractFactory
{
/// <summary>
/// oracle工厂
/// </summary>
public class OracleFactory:IFactory
{
public IUserOpr CreateUser()
{
return new OracleUserOpr(); } public IDepartMentOpr CreateDepartMent()
{
return new OracleDepartMentOpr();
}
}
}
sqlserver工厂
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace AbstractFactory
{
/// <summary>
/// sqlServer工厂
/// </summary>
public class SqlserverFactory:IFactory
{ public IUserOpr CreateUser()
{
return new SqlServerUserOpr(); } public IDepartMentOpr CreateDepartMent()
{
return new SqlServerDepartMentOpr();
}
}
}
业务调用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace AbstractFactory
{
class Program
{
static void Main(string[] args)
{ //oracle操作
//IFactory dbFactory1 = new OracleFactory();
//切换数据库为sqlserver
IFactory dbFactory1 = new SqlserverFactory();
IUserOpr oprUser = dbFactory1.CreateUser();
oprUser.Insert();
oprUser.Update();
IDepartMentOpr oprDepartMent = dbFactory1.CreateDepartMent();
oprDepartMent.Insert();
oprDepartMent.Update(); Console.WriteLine("-----------------------------------------");
Console.ReadKey();
}
}
}
调用结果
sqlserver调用结果如下

切换为oracle数据结果如下

总结
优点
抽象工厂模式最大的好处就是易于更换产品系列(如上述示例中的更改数据库)
缺点
抽象工厂模式中增加新产品没有很好支持"开放-封闭"原则。
抽象工厂接口中如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这样也就违背了“开发——封闭”原则。
C#设计模式(4)-抽象工厂模式的更多相关文章
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...
- 桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式
桥接模式及C++实现 桥接模式 先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式之一 ...
- Java 设计模式之抽象工厂模式(三)
原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...
- java设计模式之抽象工厂模式
上一篇文章(http://www.cnblogs.com/liaoweipeng/p/5768197.html)讲了简单工厂模式,但是简单工厂模式存在一定的问题,如果想要拓展程序,必须对工厂类进行修改 ...
- php设计模式之抽象工厂模式
之前总结了一下工厂模式,其实准确地说是简单 工厂模式,在它的基础上再进行抽象就可以得到一种新的模式:抽象工厂模式. 专业一点的定义为: 抽象工厂模式(Abstact Factory)是一种常见的软件设 ...
- 再起航,我的学习笔记之JavaScript设计模式06(抽象工厂模式)
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前两 ...
- C#设计模式之四抽象工厂模式(AbstractFactory)【创建型】
一.引言 写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了 ...
- Head First设计模式之抽象工厂模式
一.定义 给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足一下条件: 1)系统中有多个产品族,而系统一次只可能消费其中一族产品. 2)同属于同一个 ...
- 【Unity与23种设计模式】抽象工厂模式(Abstract Factory)
GoF中定义: "提供一个能够建立整个类群组或有关联的对象,而不必指明它们的具体类." 意思就是 根据不同的执行环境产生不同的抽象类子类 抽象工厂模式经常在面试中会涉及到 下面的例 ...
随机推荐
- 利用GPU实现大规模动画角色的渲染
0x00 前言 我想很多开发游戏的小伙伴都希望自己的场景内能渲染越多物体越好,甚至是能同时渲染成千上万个有自己动作的游戏角色就更好了. 但不幸的是,渲染和管理大量的游戏对象是以牺牲CPU和GPU性能为 ...
- jdk 环境变量配置方法总结
全部修改在用户变量/系统变量 系统变量→新建 JAVA_HOME 变量 .变量值填写jdk的安装目录(本人是 D:\java\Java\jdk1.8.0_72) 系统变量→寻找 Path 变量→编辑在 ...
- 亚马逊AWS EC2云实例AMI安装LNMP环境(1)——Nginx安装
概括:这里选择亚马逊EC2的Linux AMI实例,该Linux服务器是亚马逊预配置的Linux环境,内置多个YUM源,属于亚马逊首推的稳定Linux服务器.默认登录用户名为ec2-user,执行ro ...
- jQuery源码分析-03扩展工具函数jQuery.extend
// 扩展工具函数 jQuery.extend({ // http://www.w3school.com.cn/jquery/core_noconflict.asp // 释放$的 jQuery 控制 ...
- LoadRunner性能测试-loadrunner事务
事务(Transaction): 简单来说就是用来模拟用户的一个相对完整的业务过程.添加事务,是用来衡量响应时间的重要方法.我们可以通过事务计时来对不同压力负载下的性能指标进行对比. 插入事务的方法: ...
- .net操作IIS,新建网站,新建应用程序池,设置应用程序池版本,设置网站和应用程序池的关联
ServerManager类用来操作IIS,提供了很多操作IIS的API.使用ServerManager必须引用Microsoft.Web.Administration.dll,具体路径为:%wind ...
- 搭建hadoop、hdfs环境--ubuntu
最近在学习hadoop相关知识,就在本机上安装了hadoop,遇到了一些坑,也学到了不少.仅此记录我的安装过程,及可能遇到的问题.供参考.交流沟通见页末. 软件准备 > 虚拟机(VMware) ...
- angular学习(七)-- Service
1.7 服务:Service 如果做过后台开发,那么对 Angular 中的服务就好理解多了. 在 Angular 中,服务的概念和后台的服务概念基本是一样的,差别只是在于技术细节. 服务是对公共代码 ...
- IE浏览器-官网下载地址
这里仅列出IE浏览器在微软官网的下载地址,便于日常使用. WindowsXP | IE6下载地址:http://www.microsoft.com/zh-CN/download/details.asp ...
- python2 接口测试一般方法.
接口测试方法: 1. import requests 2. 创建一个url变量,并经访问的地址赋值给它.(包括端口后面的 接口的部分) 例如: url = "http://124.193.9 ...