设计模式之工厂方法模式VS简单工厂方法模式
名词解释:
简单工厂:这个实在是没什么解释的,就是一个工厂类,然后有一个方法,根据传递的参数可以通过switch(你也可以是if,或者是使用高端的反射 )来进行对象的创建。
工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
区别:简单工厂的优点是工厂类中包含了逻辑(即通过判断,实例化对应的类型),对于客户端来说去除了与具体产品的依赖。但是如果有了新功能则就需要修改这个判断的逻辑(也就是违背了开放-封闭原则),所以这个也是工厂方法出现的必要性。工厂方法呢每一个类都有自己的工厂,当然也有抽象的工厂基类,这样客户端想实例哪种类型,只需实例化其对应的工厂即可。
必要元素:
实体类的抽象类(也可以是接口)、抽象工厂类(可以是接口)、各种实体类(继承自抽象类或者实现自接口)、各种实体工厂(继承自抽象工厂类或者实现自接口)。
上例子:
实体抽象类以及各个实体类:
abstract class Operation
{
public double NumberA { get; set; }
public double NumberB { get; set; }
public abstract double GetResult();
} class OperationAdd:Operation
{
public override double GetResult()
{
return NumberA + NumberB;
}
} class OperationDiv:Operation
{
public override double GetResult()
{
if (NumberB == )
throw new Exception("除数不能为0");
return NumberA / NumberB;
}
} class OperationMul:Operation
{
public override double GetResult()
{
return NumberA * NumberB;
}
} class OperationSub:Operation
{
public override double GetResult()
{
return NumberA - NumberB;
}
}
抽象工厂类和各个实体工厂类:
abstract class OperationFactory
{
public abstract Operation CreationOperation();
} class OperationAddFactory : OperationFactory
{
public override Operation CreationOperation()
{
return new OperationAdd();
}
} class OperationSubFactory : OperationFactory
{
public override Operation CreationOperation()
{
return new OperationSub();
}
} class OperationMulFactory : OperationFactory
{
public override Operation CreationOperation()
{
return new OperationMul();
}
} class OperationDivFactory:OperationFactory
{
public override Operation CreationOperation()
{
return new OperationDiv();
}
}
客户端使用:
Operation operation = factory.CreationOperation();
operation.NumberA = ;
operation.NumberB = ;
double result = operation.GetResult();
Console.WriteLine(result); factory = new OperationSubFactory();
operation = factory.CreationOperation();
operation.NumberA = ;
operation.NumberB = ;
result = operation.GetResult();
Console.WriteLine(result);
这样,如果我们有新的类型出现,则增加实体类,并且增加实体类的工厂即可,在客户端就可以直接使用新的工厂创建新的类型了。
总结:
工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现实体的创建,选择判断的问题还是存在,也就是说工厂方法把简单工厂内部逻辑判断移到了客户端代码来实现,之前如果要增加类型,修改的是工厂类,现在直接修改客户端即可(当然如果增加了某一个类型,也是需要增加其相对应的工厂类)。
设计模式之工厂方法模式VS简单工厂方法模式的更多相关文章
- Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式
工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...
- java之设计模式工厂三兄弟之简单工厂模式
[学习难度:★★☆☆☆,使用频率:★★★☆☆] 工厂模式是最常用的一类创建型设计模式,通常我们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式.本章将要学习的简单工厂模式是工厂方法模式的& ...
- 设计模式之策略模式&简单工厂模式
学习设计模式已经有非常长一段时间了,事实上先前已经敲过一遍了.可是老认为没有学到什么,认识也不够深刻.如今趁着重构机房,再又一次来过,也不晚. 事实上在敲了机房之后,看看模式,事实上,曾经非常难理解. ...
- 设计模式在cocos2d-x中的使用--简单工厂模式(Simple Factory)
什么是简单工厂模式? 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式.通过专门定义一个类来负责创建其它类的实例,被创建的实例 ...
- C++设计模式 ==> 策略模式与简单工厂模式结合
简介 策略模式相较之于简单工厂模式适用于生产方法经常变化且方法较为繁多的情况,因为生产方法时常变化就会需要频繁修改工厂类,违背了开闭原则,这时就可以用策略选择类由客户端根据需求动态切换策略.且策略模式 ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂
简单工厂:工厂依据传进的参数创建相应的产品. http://www.cnblogs.com/DelphiDesignPatterns/archive/2009/07/24/1530536.html { ...
- Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】
原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part3-factory/ Design ...
- 【LabVIEW技巧】工厂模式_简单工厂
前言 上一个文章介绍了如何学习LabVIEW OOP,简要的提及了一些OOP学习中注意的事项,许多文章的读者反映写的太范,后文会逐步缩小范围,讨论在LabVIEW中各个模式的应用. 工厂模式概述 工厂 ...
- factory工厂模式之简单工厂SimpleFactory
简单工厂(Simple Factory) 又叫静态工厂,是工厂模式三中状态中结构最为简单的.1.主要有一个静态方法,用来接受参数,并根据参数来决定返回实现同一接口的不同类的实例.2.或者针对每个产品, ...
- Java学习笔记——Java工厂模式之简单工厂
package com.app; import java.util.Date; /* * 工厂模式:简单工厂.工厂方法.抽象工厂 * * */ public class Test0718_Factor ...
随机推荐
- ECSHOP订单自动确认
1.运行sql代码,生成数据库 CREATE TABLE `ecs_order_auto_confirm` ( `id` INT() UNSIGNED NOT NULL AUTO_INCREMENT, ...
- 解决DataSnap支持的Tcp长连接数受限的两种方法
如何解决DataSnap支持的Tcp长连接数受限的问题? 方案一: 采用代理服务器方式,基本流程为: 1.客户先连接代理服务器:2.获取可用的服务器IP和端口:3.关闭与代理服务器之间的连接:4.建立 ...
- Selenium-RC Python 2.7 环境配置
1.下载并安装Python http://www.python.org/getit/,我使用的是2.7.3的python版本 2.下载并安装setuptools[这个工具是python的基础包工具] ...
- How to use the SQLIOSim utility to simulate SQL Server activity on a disk subsystem
SQLIOSim是模拟SQLServer的行为来测试IO性能,也可以对损坏磁盘进行一定校验 这是一个SQL Server 2012 安装完后自带的工具 一般在C:\Program Files\Micr ...
- IOS仿Android九宫格解锁效果[转]
原理很简单,监听view中touch的一系列事件,当判定手指位置在某个按钮附近的时候则判断此按钮选中,并画出线. 效果图如下: 你可以在NineGridUnlockView.m文件中方法 touche ...
- c++程序开发利器
c++程序开发利器 vc6visual stdio系列都很好,个人最喜欢vc6,主要原因是快捷,classview和wizardbar功能强大,其他vs秒杀其他的vs windbgWinDbg是在wi ...
- iOS常见问题(3)
一.发现不少人在给成员变量初始化的时候,容易进错一个方法去初始化. //注意这个方法只有在内存发生警告的时候才会调用. - (void)didReceiveMemoryWarning { [super ...
- Codeforces Round #358 (Div. 2) D. Alyona and Strings 字符串dp
题目链接: 题目 D. Alyona and Strings time limit per test2 seconds memory limit per test256 megabytes input ...
- javamail邮件发送报错解决方案
如果你用myEclipse进行开发的话,运行时可能会出现以下的错误:Exception in thread "main" java.lang.NoClassDefFoundErro ...
- hibernate4.0中SessionFactory的创建
创建SessionFactory 首先创建Configuration对象,主要方式是: new Configuration().configure() 默认情况下Hibernate会去classPat ...