设计模式你怎么看?--抽象工厂模式
一 前言
在设计模式中有简单工厂,工厂方法,抽象工厂,这三种工厂方法,各自有各自的特点,但有都有共同的特点 工厂(Factory)都是围绕着工厂类转,这篇只写 "抽象工厂"相关的内容 上一篇的地址在这里
设计模式你怎么看?--简单工厂模式
二 抽象工厂介绍
2.1 什么是抽象工厂模式
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象(来自百科)
2.2 抽象工厂模式优缺点
优点:易于更改产品类型 如 可以很方便的更改SqlFactory 与OracleFactory,另外使得客户端于业务层分离,客户端所接触的都是IProductA 和IFactory
缺点:当新增一种产品类型时改动会较大,例如当需要增加ProductB时需要增加IProductB SqlProductB OracleProductB,还要修改IFactory,SqlFactory,OracleFactory。
2.3 抽象工厂模式UML类图
业务情景如下:在某个系统中未来可能会更换数据库类型如SQLServer,Access ,Oracle 等。要求修改与维护的成本要低。在这种情况下用抽象工厂解决这种问题是很好的因为不同数据库对CRUD操作是语法不完全相同,因此比较好的方法是定义一个抽象类或接口然后让不同的子类去实现自己的变化,再通过各自的工厂方法将实例提供到客户端
下图正是这么一个过程每个Product都有自己的接口与工厂,在调用时Client调用SqlFactory然后返回SqlProductA的实例到Client中
三 抽象工厂代码
定义工厂的接口规范所有不同类型的工厂类
//工厂接口public interface IFactory{IProductA CreateInstance();}
具体类型的工厂类 用于创建对应类型的产品实例
//Sql类型的工厂类 class SqlFactory : IFactory{public IProductA CreatProductA(){return new SqlProductA();}}
同上
//Oracle类型的工厂类class OracleFactory:IFactory{public IProductA CreatProductA(){return new OracleProductA();}}
定义具体产品的共有特性
//定义ProductA所共有的方法public interface IProductA{void CreatProductA();void DeleteProductA();}
具体产品特性的实现
//实现IProductA定义的共有方法class SqlProductA:IProductA{public void CreatProductA(){Console.Write("新增SQLServer下的ProductA");}public void DeleteProductA(){Console.Write("删除一个SQLServer下的ProductA");}}
//实现ProductA共有方法class OracleProductA:IProductA{public void CreatProductA(){Console.Write("新增Oracle下的ProductA");}public void DeleteProductA(){Console.Write("删除一个Oracle下的ProductA");}}
客户端调用
//SQL类型IFactory sqlFactory = new SqlFactory();IProductA sql = sqlFactory.CreatProductA();sql.CreatProductA();sql.DeleteProductA();//Oracle类型IFactory oracleFactory = new OracleFactory();IProductA oracle = oracleFactory.CreatProductA();oracle.CreatProductA();oracle.DeleteProductA();
结果如下
四 总结
设计模式的根本目的是让程序之间的耦合降低,提高程序的健壮性,任何业务的与代码的变化都是要付出代价的。学会把设计模式应用到实际项目中,可以适当的降低这种代价,但任何事都是具有两面性的,减少耦合代码量肯定是要增加的。尝试找到平衡点设计模式就是才是真正用好了。
本人水平有限,如有不对之处还请指出 谢谢~
如果您觉得本文有给您带来一点收获,不妨点个推荐,为我的付出支持一下,谢谢~
如果希望在技术的道路上能有更多的朋友,那就关注下我吧,让我们一起在技术的路上奔跑
转载于:https://www.cnblogs.com/zery/p/3617847.html
设计模式你怎么看?--抽象工厂模式相关推荐
- 设计模式(6)——抽象工厂模式(Abstract Factory Pattern,创建型)
1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.抽象工厂模式(Abstract Factory Pattern)属于创建型模式,为创建一组相关或者相互依赖的对象(产品族)提供一个抽象 ...
- 【Java设计模式】简单学抽象工厂模式——你好,微信还是支付宝
目录 说明 实现方式 自问自答 其他链接 说明 五大创建型模式之一,其他还有单例模式.原型模式.建造者模式.工厂模式. 抽象工厂模式(Abstract Factory Pattern):定义了一个in ...
- 设计模式笔记二:抽象工厂模式
原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出,欢迎讨论. 简单定义: 抽象工厂模式(Abstract Factory Pattern) ...
- 笔记:设计模式(3)-Abstract Factory抽象工厂模式
工厂模式的起源 1.变化点在"对象的创建",因此就封装"对象创建": 2.面向接口编程,依赖接口,而非依赖实现. 动机(Motivation) 在系统中,经 ...
- 设计模式之十一:抽象工厂模式(Abstract Factory)
抽象工厂模式: 提供了一个创建一系列相关的或相互依赖的对象的接口而不须要详细指定它们的类型. Provide an interface for creating families of related ...
- Javascript设计模式(三)-- 抽象工厂模式
抽象工厂模式:通过对类的工厂抽象使其业务用于对产品类簇的创建,而不负责创建某一类产品的实例. 抽象类 //测试抽象类,使用其实例方法时会抛出错误 var test = function(){}; te ...
- 设计模式---(3)抽象工厂模式
抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最 ...
- 设计模式详解:抽象工厂模式
今天我们来看一下另一个使用频率非常高的抽象工厂模式,看完原理分别给出.NET和JAVA两种语言的实现源码. 定义: 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类. ...
- 设计模式(二)抽象工厂模式
抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最 ...
- 【设计模式与Android】抽象工厂模式——嵌合体克隆工厂
什么是抽象工厂模式 所谓抽象工厂模式,就是为创建一组相关或者是互相依赖的对象提供一个接口,而不需要指定它们的具体类的设计模式.抽象工厂模式适用于一个对象族有相同的约束的情况,用不抽象的语言解释就是国内 ...
最新文章
- 一个NODE_ENV 引发的血案
- Sublime Text插件的离线安装-使用htmlprettify美化您的HTML代码
- python3.4.4 配置opencv3.1 解决pip版本不够的问题
- linkedin软件 iPad pro 2018 和huawei mate 30内存使用的对比情况
- android 文件mimetype_【Android】NFC课件
- VTK:结构化网格之VisualizeStructuredGridCells
- java 1.5.0 gcj_CentOS安装JAVA后JAVA版本不对的问题
- 辐射避难所买了东西显示服务器异常,辐射避难所常见问题汇总 专治疑难杂症...
- CASIA WebFace、WIDDER FACE、FDDB、AFLW、CelebA训练集详解
- good nice fine well区别
- 使用Python来调用电脑音响
- Runloop与autoreleasePool联系
- 解决IE11兼容HTML5 设置
- pythonhistogram教程_Plot Histogram in Python
- 企业财务管理中的数据分析应用
- 凌晨!科比因坠机离世, 球迷泪崩:凌晨4点,我的青春没了
- 导致网页图片字体模糊的原因
- iOS13苹果登录的后台验证token(JAVA)
- 中国科学技术大学常用网址
- 危机,熊猫烧香进入手机!!!
热门文章
- 通过Redis实现分布式锁
- 【IM】关于多任务学习的理解
- 【正一专栏】马蓉到底对王宝强还有啥感情?
- Redis的常用命令——String的常用命令
- AOP开发——在不修改源代码的前提下,对类里面的方法进行增强 : 前置 后置 环绕 异常||如何得到目标方法的参数和返回值
- Python 【抖音】短视频的自动上传与发布实例演示,同时支持快手、哔哩哔哩、小红书、微视、西瓜视频、微信视频号等平台的视频自动化同步发布
- Github上删除仓库、项目方法演示
- 用C语言实现控制台模拟显示时
- CTFshow 命令执行 web73
- 9.3 图像变换(尺寸变换、旋转变换、灰度变换和数据类型变换)