工厂模式三部曲之二_工厂模式
自《工厂模式三部曲之一_简单工厂模式》之后,貌似已经很久没有继续这个三部曲了,所以抽点时间把后两篇给补上吧。首先回顾下简单工厂模式的主要内容:简单工厂模式就是实质就是专门定义了一个工厂类,利用工厂类的静态方法来根据用户需求创建对象,优点是客户端的压力较小,客户端不需要做创建实例的操作,只需要调用工厂类中的方法就可以获得对应实例,而其缺点也非常明显,其所有创建工作都在一个工厂类完成,耦合性较高,而且当系统需要增加或者修改产品时需要改动工厂类,既不符合单一职责的原则也不符合开放-关闭原则,所以就出现了工厂模式。
工厂模式
工厂模式是对简单工厂模式的进一步抽象化,是简答工厂模式的衍生,根据设计模式的基本原则也是设计模式的精髓“封装变化点”,即哪里发生改变就把哪里封装起来,所以工厂模式对简单工厂中的工厂类做了一个封装,使其满足单一职责和开放-关闭原则。
【解决问题】:简单工厂模式中违背了单一职责和开放-关闭原则。
【核心思想】:建立一个抽象工厂的基类,给每个产品建立一个工厂,该工厂继承之抽象工厂,规定每个产品都有特定的工厂来创建。
【角色】
抽象工厂角色:这是工厂模式的核心,它与应用程序无关,是具体工厂必须继承的父类或者必须实现的接口
具体工厂角色:包含逻辑业务的代码,由应用程序调用以创建对应的具体产品对象
抽象产品角色:具体产品必须继承的父类或者必须实现的接口
具体产品角色:所创建的对象就是此角色的实例
下面仍旧以简单工厂中的实例来讲解,对其进行改造
【角色分析】
具体工厂:**类型衣服制造厂 每个衣服制造厂只负责一件衣服(高内聚) ,当然也就是说当没有客户需要的衣服的时候需要创建一个对应的工厂及一件衣服 由该工厂负责提供这件衣服 但是对于以前的工厂和衣服都没有影响(这是设计模式所期望的--单一职责原则)
具体产品:**类型衣服 继承抽象产品,当然可扩展自身特性
角色分析好了,就可以进行改造了,贴上改造完毕的各个部分代码:
抽象工厂类:
2 public abstract class ClothFactory
3 {
4 public abstract Cloth CreateCloth();
5 }
该类中定义了一个抽象的CreateCloth()方法,用于创建衣服实例。
具体工厂类:
2 public class BusinessFactory : ClothFactory
3 {
4 public override Cloth CreateCloth()
5 {
6 return new BusinessCloth();
7 }
8 }
9
10 //具体工厂2:运动装工厂 只负责生产运动装
11 public class SportFactory : ClothFactory
12 {
13 public override Cloth CreateCloth()
14 {
15 return new SportCloth();
16 }
17 }
18
19 //具体工厂3:校服工厂 只负责生产校服
20 public class LifeFactory : ClothFactory
21 {
22 public override Cloth CreateCloth()
23 {
24 return new LifeCloth();
25 }
26 }
该类为核心,类中定义了BusinessFactory,SportFactory,LifeFactory三个工厂分别来创建商务装,运动装,校服,三个工厂都继承之抽象工厂ClothFactory,并都重写了抽象工厂中的CreateCloth()方法,分别用来创建该工厂生产的衣服,利用里氏替换原则(子类代替父类)来实现,这是产品需要改变(添加,修改,删除)时,如添加,只需要添加一个专门生产该产品的工厂和该产品就可以了,添加操作对之前所有的工厂和产品没有直接的影响。修改同理,只需要修改创建该产品的工厂类就可以了,很好的遵循了开放-关闭原则,同时一个工厂类创建一个产品,遵循了单一职责的原则。
抽象产品类:
2 public abstract class Cloth
3 {
4 public abstract void GetCloth();
5 }
该方法不需要作改变,仍旧定义了一个GetCloth()方法,模拟使用产品。
具体产品类:
2 class BusinessCloth : Cloth
3 {
4 public override void GetCloth()
5 {
6 Console.WriteLine("商务装......");
7 }
8 }
9
10 //定义具体产品2:运动装
11 class SportCloth : Cloth
12 {
13 public override void GetCloth()
14 {
15 Console.WriteLine("运动装.......");
16 }
17 }
18
19 //定义具体产品3:休闲服
20 class LifeCloth : Cloth
21 {
22 public override void GetCloth()
23 {
24 Console.WriteLine("休闲服........");
25 }
26 }
该类也不需要作任何改变,根据哪里封装改变哪里,工厂类的封装和产品没有直接的影响,仍旧定义了三种类型的衣服,并重写抽象产品中的抽象方法,因为每种产品都有自身特性,有自身独特的功能。
客户端:
2 class Program
3 {
4 static void Main(string[] args)
5 {
6 //要求商务装
7 Cloth c = new BusinessFactory().CreateCloth();
8 c.GetCloth();
9
10 //要求运动装
11 Cloth c2 = new SportFactory().CreateCloth();
12 c2.GetCloth();
13
14 Console.ReadKey();
15 }
16 }
运行效果:
优缺点总结:
优点:解决了简单工厂中违背单一职责和开放-关闭原则问题,同时增加了程序的可扩展性,屏蔽了产品类。
缺点:1.逻辑判断放在了客户端进行
2.每添加一个产品都需要为它专门添加一个工厂用来生产,繁杂
3.每个工厂都只能生产一种产品,品种单一。
转载于:https://www.cnblogs.com/holyknight-zld/archive/2012/09/06/MethodFactory.html
工厂模式三部曲之二_工厂模式相关推荐
- 苹果手机变成耳机模式怎么调回来_苹果耳机模式怎么调回来
有的时候手机会无缘无故进入耳机模式,具体表现就是已经把耳机从手机的耳机孔中拔出,但是手机依旧不会使用外放喇叭播放,在控制中心依旧显示有耳机的插入状态,那么苹果耳机模式怎么调回来呢?今天给大家详细介绍一 ...
- c 工厂模式与mysql链接_工厂模式连接数据库
在项目中通常可能会使用不同的数据源,可能是SQL Server也可能是ACCESS或者是Oracle,那么如何保证在使用不同数据源的时候,使项目代码更改的代价最小呢? 对,使用工厂模式.在Net1.1 ...
- Spring模式系列(二) 工厂模式(Factory Pattern) - 理解Spring的第一课
factory pattern在spring的用法 Beanfactory spring框架最依赖的模式,没有之一 这也许是最多程序员使用过的模式之一,我也在我的项目中用过很多次.工厂模式贯穿于整个S ...
- Java代理模式:(二)代理模式
一.常见的概念: 1.代理模式(Proxy):为其他对象设置一个代理来控制对这个对象的访问: 2.代理模式分为:静态代理模式.动态代理模式 二.分类: 1.静态代理模式:为目标对象创建一个代理对象,在 ...
- java计数器策略模式_java设计模式(二十一)--策略模式
对于策略模式,我在很多面试题上看到过考察这一类的问题,这种模式也的确比较好用. 我感觉这种模式就是将不同实现的方法放到一个接口中,然后通过实现这个接口来实现不同的运行结果,这种模式有三部分构成: 策略 ...
- 工厂模式三部曲之三_抽象工厂模式(附三部曲源码)
抽象工厂模式是对工厂模式的进一步抽象,是工厂模式中最为抽象和最具一般性的一种形态,提供了创建一系列相关或者相互依赖对象的接口,而无需指定他们的类型. 如果你对工厂模式还有些迷惑的,可以回顾下工厂模式的 ...
- 设计模式-工厂模式三部曲
设计模式-工厂模式三部曲(转) 转自:http://www.cnblogs.com/holyknight-zld/category/402079.html 工厂模式三部曲之一_简单工厂模式 转自:ht ...
- 工厂模式三部曲之一_简单工厂模式
这段时间想要好好了解下工厂模式,从而在园中看了很多博友的关于工厂模式的博客, 受益匪浅......同时也感谢各位博友对知识的无私的分享....知识在于积累,但个人觉得积累知识的最好方式是当自己学懂了某 ...
- java策略模式 工厂模式_策略模式和工厂模式搭配使用
策略模式和工厂模式的搭配使用可以很好地消除代码if-else的多层嵌套 需求 针对店下商铺,有这样一个需求,对用户客户分为了普通客户.vip客户.超级vip用户.专属vip用户4个等级,每当用户购买商 ...
最新文章
- dubbo 部分 配置的关系-dubbo github 官方案例
- java native内存_android java内存与native内存
- 虚拟机安装ROS的IMG镜像(从U盘启动)
- 【贵州】2021年下半年软考报考时间及通知
- 复现经典:《统计学习方法》第 7 章 支持向量机
- c语言程序找出500以内的所有素数,c语言求出给定范围内的所有质数
- 三年租男友回家竟花了10万......
- kudu建表:Not enough live tablet servers to create a table with the requested replication factor 3. 2
- 主机硬件系统主板状态 vmware_电脑主机启动不了怎么办?
- 调用百度API实现人像动漫化(C++)
- java+swing+教科书,java+Swing+学生事务管理系统
- 计算机考试感受作文,关于考试后的感想作文(精选10篇)
- 银行卡号正则表达式(严格匹配,2020年)已更新
- python判断火车票座位号分布图_火车座位分布图
- 直接跳转到app store指定应用页面或评论页面
- 会员自动续费服务协议
- 解决LS-DYNA中负体积方法
- Word中的手动换行符
- Debian 8.0桌面系统root用户登录和root用户自动登录
- J4125小主机部署软路由笔记01