设计模式04: Factory Methord 工厂方法模式(创建型模式)
Factory Methord 工厂方法模式(创建型模式)
从耦合关系谈起
耦合关系直接决定着软件面对变化时的行为
-模块与模块之间的紧耦合使得软件面对变化时,相关的模块都要随之变更
-模块与模块之间的松耦合使得软件面对变化时,一些模块更容易被替换或者更改,但其他模块保持不变
对代码的关注要在理解了设计模式之后,对于不同的代码但是解决的是同一类问题,他们就是同一种设计模式。解决了哪一类的问题就是哪一类的设计模式。
软件需求的变化是软件工程的一部分,是我们要解决的问题。
把模块分为主模块、次模块
主模块部分变化慢、次模块部分变化快
抽象部分变化慢,具体部分变化快
设计模式不能上去就用,当不清楚模块与模块之间的关系时,就不要用。
动机(Motivation)
在软件系统中,经常面临着“某个对象”的创建工作;由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口。
如何应对这种变化?如何提供一种“封装机制”来隔离出“这个易变对象”的变化,从而保持系统中“其他依赖该对象的对象”不随着需求改变而改变?
意图(Intent)
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类——《设计模式》GoF
示例代码:
public abstract class AbstractCar
{
public abstract void Startup();
public abstract void Run();
public abstract void Turn(Direction direction);
public abstract void Stop();
}
pubic class HongqiCar:AbstractCar
{
public override void Startup()
{
//...
}
public override void Run()
{
//...
}
public override void Turn(Direction direction)
{
//...
}
public override void Stop()
{
//...
}
}
pubic class DongfengCar:AbstractCar
{
public override void Startup()
{
//...
}
public override void Run()
{
//...
}
public override void Turn(Direction direction)
{
//...
}
public override void Stop()
{
//...
}
}
public abstract class AbstractCarFactory
{
public abstract AbstractCar CreateCar();
}
public class HongqiCarFactory:AbstractCarFactory
{
public override AbstractCar CreateCar()
{
return new HongqiCar();
}
}
public class DongfengCarFactory:AbstractCarFactory
{
public override AbstractCar CreateCar()
{
return new DongfengCar();
}
}
class CarTestFramework
{
public void BuildTestContext(AbstractCarFactory carFactory)
{
AbstractCar c1=carFactory.CreateCar();
}
//...
}
class App
{
public static void Main()
{
CarTestFramework carTestFramework=new CarTestFramework();
carTestFramework.BuildTestContext(new HongqiCarFactory());
carTestFramework.BuildTestContext(new DongfengCarFactory());
//也可以通过配置文件和反射来解决new的不同
//Activator.CreateInstance(string TypeName)
}
}
Factory Method模式的几个要点
Factory Method模式主要用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系会导致软件的脆弱。
Factory Method模式通常通过面向对象的手法,将所要创建具体对象工作延迟到子类,从而实现一种扩展(而非改变)的策略,较好的解决了这种紧耦合关系。
Factory Method模式解决了“单个对象”的需求变化,Abstract Factory模式解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化。
设计模式04: Factory Methord 工厂方法模式(创建型模式)的更多相关文章
- FactoryMethod工厂方法模式(创建型模式)
1.工厂方法模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只 ...
- Prototype原型模式(创建型模式)
1.原型模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只有一 ...
- 设计模式(三): FACTORY工厂模式 -- 创建型模式
1.定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类. 2.适用场景 1.第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体 ...
- 工厂方法模式——创建型模式02
1. 简单工厂模式 在介绍工厂方法模式之前,先介绍一下简单工厂模式.虽然简单工厂模式不属于GoF 23种设计模式,但通常将它作为学习其他工厂模式的入门,并且在实际开发中使用的也较为频繁. (1 ...
- 设计模式之美:Creational Patterns(创建型模式)
创建型模式(Creational Patterns)抽象了对象实例化过程. 它们帮助一个系统独立于如何创建.组合和表示它的那些对象. 一个类创建型模式使用继承改变被实例化的类. 一个对象创建型模式将实 ...
- Java 23种设计模式详尽分析与实例解析之一--创建型模式
面向对象的设计原则 常用的面向对象设计原则包括7个,这些原则并不是独立存在的,它们相互依赖.互为补充. Java设计模式 创建型模式 简单工厂模式 模式动机: 考虑一个简单的软件应用场景,一个软件系统 ...
- 设计模式(五):PROTOTYPE原型模式 -- 创建型模式
1.定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.适用场景 原型模式的主要思想是基于现有的对象克隆一个新的对象出来,一般是有对象的内部提供克隆的方法,通过该方法返回一个对 ...
- 设计模式(二): BUILDER生成器模式 -- 创建型模式
1.定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 2.适用场景 1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式 ...
- 设计模式(一): abstract factory抽象工厂模式 -- 创建型模式
1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要 ...
随机推荐
- 1073 Scientific Notation
题意: 给出科学计数法的形式,转化成常规的表示,要求保留所有的有效位数 思路:纯粹的字符串处理问题,注意边界条件即可.如+1.23E+02这种,转化后是123,既不需要补0,也不需要添加小数点. 代码 ...
- python学习(十一) 文件和流
11.1 打开文件 >>> f = open(r'c:\text\somefile.txt'), 第一个参数是文件名,必须有:第二个是模式:第三个参数是缓冲. 11.1.1 文件模 ...
- C++11 变量和函数的链接性
在全局变量前添加const或者static,则该变量链接性为内部,即文件内有效.可以使用extern声明为外部. 如果要让函数的链接性为内部,则函数声明和定义都应使用static关键字. 例子: te ...
- php代码执行漏洞
php代码执行的两个函数eval(),assert() <?php $i = $_GET['x']; eval($i); ?> eval()函数将以php类型执行传入的参数x的值 给x传入 ...
- JavaScript之BON
1.windows对象 全局作用域: 2.窗口关系及框架 如果页面包含框架,则每个框架都有自己的window对象,并且保存在iframes集合中,在iframe集合中,可以通过数值索引(从0开始,从左 ...
- 自定义对话框<转>
效果如下: <ignore_js_op> QQ截图20130221234404.png (51.02 KB, 下载次数: 126) 下载附件 保存到相册 2013-2-21 23:44 ...
- Basics
[Basics] 1.You can declare multiple constants or multiple variables on a single line, separated by c ...
- Windchill 设计变更流程卡死查询方法
设计变更流程卡死查询方法 1. 导出设计变更表单查看填写了“需要”和“是”字眼的文本框 2.打开进程管理器显示流程卡死的地方,确定哪里出错导致没法执行下一步 3.打开设计变更流程图,里面可以查看有 ...
- 【总结整理】KANO 模型
c 基本(必备)型需求——Must-beQuality/ Basic Quality. 期望(意愿)型需求——One-dimensional Quality/ Performance Quality. ...
- 线程dump
当应用程序运行变慢或者发生故障时,可能通过分析java的Thread Dumps得到分析他们得到阻塞和存在瓶颈的线程. 线程堆栈是虚拟机中线程(包括锁)状态的一个瞬间状态的快照,即系统在某一个时刻所有 ...