创建型模式-工厂方法模式(二)
目录
工厂方法模式描述
工厂方法模式存在的问题
解决方案
使用场景
优缺点对比
代码
工厂方法模式描述
工厂方法模式,是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。
工厂方法模式存在的问题
如果你老板,开发了一款出售灯饰的系统,最初设计的是只有一种灯,蓝色的灯,然后你把大部分的代码都写在了蓝灯类中,一段时间后,你的货物销量非常好,而且销售到了海外,海外客户希望你能出售红灯的产品,这对于公司来说,非常有利。但是此时的代码已经全部写在蓝灯类里面了,你是在蓝灯类里面,增加红灯的逻辑吗?这样修改量太大了,如果以后增加绿灯怎么办呢?
解决方案
工厂方法模式建议使用特殊的工厂方法代替对于对象构造函数的直接调用(即使用 new运算符)。 不用担心,对象仍将通过new运算符创建,只是该运算符改在工厂方法中调用罢了。 工厂方法返回的对象通常被称作 “产品”。
使用场景
1.当你在编写代码的过程中,如果无法预知对象确切类别及其依赖关系时,可使用工厂方法。
2.如果你希望用户能扩展你软件库或框架的内部组件,可使用工厂方法。
3.如果你希望复用现有对象来节省系统资源, 而不是每次都重新创建对象,可使用工厂方法。
优缺点对比
优点 | 缺点 |
你可以避免创建者和具体产品之间的紧密耦合 | 应用工厂方法模式需要引入许多新的子类, 代码可能会因此变得更复杂。 最好的情况是将该模式引入创建者类的现有层次结构中 |
单一职责原则。 你可以将产品创建代码放在程序的单一位置, 从而使得代码更容易维护 | |
开闭原则。 无需更改现有客户端代码, 你就可以在程序中引入新的产品类型 |
其中简单工厂模式属于工厂模式,工厂模式保持了简单工厂模式的优点,而且克服了它的缺点。
图示表达
看起来很麻烦,其实记忆起来非常的简单。首先分2部分,抽象工厂和具体工厂,然后有几个抽象产品就有几个具体产品,他们是一 一对应的关系。
代码
1.建立一个控制台程序,代码文件总览。可见上面说的缺点,就体现出来了,写了很多的子类,如果分不清结构,将是灾难性的代码。
2.抽象产品,Light类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApp3
{public abstract class Light //建立抽象产品, abstract,不能实例化{public abstract void TurnOn(); //抽象产品有打开的方法,abstract,不能实现public abstract void TurnOff(); //抽象产品有关闭的方法,abstract,不能实现}
}
3.具体产品,BulbLight类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApp3
{public class BulbLight : Light //灯泡的光,建立具体的产品,继承灯泡{public override void TurnOff()//实现灯泡的功能,override重写继承的方法{Console.WriteLine("关闭");}public override void TurnOn() //实现灯泡的功能,override重写继承的方法{Console.WriteLine("打开");}}
}
4.具体产品,TubeLight类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApp3
{public class TubeLight : Light //灯的灯管,建立具体的产品,继承灯泡 {public override void TurnOff() //实现灯泡的功能,override重写继承的方法{Console.WriteLine("关闭");}public override void TurnOn() //实现灯泡的功能,override重写继承的方法 {Console.WriteLine("打开");}}
}
5.抽象工厂,Creator类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApp3
{public abstract class Creator //建立抽象工厂, abstract,不能实例化{public abstract Light factory(); //建立Light产品抽象类,默认方法factory}
}
6.具体工厂,BulbCreator类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApp3
{public class BulbCreator : Creator //制造灯光的厂,具体工厂,继承工厂{public override Light factory() //重写工厂的方法{return new BulbLight(); //返回制造灯泡的光}}
}
7.具体工厂,TubeCreator类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApp3
{public class TubeCreator : Creator //制造灯管的厂,具体工厂,继承工厂{public override Light factory() //重写工厂的方法{return new TubeLight(); //返回制造灯管}}
}
8.使用
using System;
using System.Threading;
using System.Threading.Tasks;namespace ConsoleApp3
{class Program{static void Main(string[] args){Creator c1 = new BulbCreator();Creator c2 = new TubeCreator();Light l1 = c1.factory();Light l2 = c2.factory();l1.TurnOn();l1.TurnOff();new BulbCreator().factory().TurnOn();Console.WriteLine("-----------------");l2.TurnOn();l2.TurnOff();new TubeCreator().factory().TurnOn();Console.WriteLine("结束");}}
}
9.效果
创建型模式-工厂方法模式(二)相关推荐
- python创建方法draw_【python设计模式-创建型】工厂方法模式
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻 ...
- 创建型设计模式----工厂方法模式
1. 介绍 1.1 定义 工厂方法模式,又称工厂模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象. 1.2 主要作用 将类的实例化(具体产品的创建)延迟到工厂类的子类(具体 ...
- 软件架构设计师-创建型模式-单例模式-原型模式-工厂方法模式-抽象工厂模式-建造者模式
文章目录 1.单例模式 2.原型模式 3.工厂方法(Factory Method)模式 4.抽象工厂(AbstractFactory)模式 5.建造者(Builder)模式 6.作者答疑 在面向对 ...
- 设计模式-创建型模式-工厂方法模式
工程源码:c++设计模式-创建型模式-工厂方法模式https://download.csdn.net/download/qq_40788199/85541617 码云:https://gitee.co ...
- 简单工厂模式+工厂方法模式
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...
- JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...
- 工厂模式 java_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...
- java web简单工厂模式_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...
- 重学Java设计模式-创建者模式-工厂方法模式
重学Java设计模式-创建者模式-工厂方法模式 内容摘自:重学 Java 设计模式:实战工厂方法模式「多种类型商品不同接口,统一发奖服务搭建场景」 | bugstack 虫洞栈 工厂方法模式介绍 图片 ...
- 设计模式学习笔记-2 创建者模式-工厂方法模式
设计模式学习笔记-2 创建者模式-工厂方法模式 工厂模式介绍 工厂模式又称工厂方法模式,是一种创建型设计模式,其在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型. 这种设计模式使Java开 ...
最新文章
- HDU 4857 Couple doubi(找循环节)
- Class.newInstance()与new、Constructor.newInstance()的区别
- java策略管理_详解Java编程中的策略模式
- CheckedListBox与下拉框联动代码
- 一位头发发白的神人教你怎么写程序,运维,买电脑,写文章,平面设计!
- C#利用NOPI处理Excel的代码
- 大数据之-Hadoop完全分布式_rsync案例_差量分发_只把有差异文件进行更新同步到其他服务器---大数据之hadoop工作笔记0032
- tar 打包、压缩和备份
- 使用vs2008搭建php扩展环境
- 【CCCC】L3-003 社交集群 (30分),并查集模板,map排序
- scrollView截取指定区域的图片
- EL表达式和JSTL的介绍以及基本使用
- centos 如何测udp端口是否开放_centos测试udp端口是否打开
- 复制文件或文件夹时出错_为什么对于小白来说,复制文件一个都会出错???...
- pyserial查看串口
- 聊聊“PPT文化”违反敏捷么
- On the Sentence Embeddings from Pre-trained Language Models
- linux下的键盘检测
- codewars练习(javascript)-2021/3/21
- Oracle 19c VLDB and Partitioning Guide 第1章:Introduction to Very Large Databases 读书笔记