- 浏览: 493336 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (329)
- [发布至博客园首页] (12)
- [随笔分类][01] .Net X (59)
- [随笔分类][20] Architecture (16)
- [随笔分类][21] Developer Logs (13)
- [网站分类]Windows 7 (1)
- [随笔分类][13] Oracle & .Net (7)
- [随笔分类][16] Love in China (14)
- [随笔分类][15] Development Tools (20)
- [随笔分类][18] Windows Phone (12)
- [随笔分类][12] Design & Pattern (17)
- [网站分类].NET新手区 (22)
- [网站分类]首页候选区 (2)
- [随笔分类][08] Windows (Server) (13)
- [随笔分类][02] CSLA.Net (3)
- [随笔分类][10] jQuery & javaScript (10)
- [随笔分类][11] SQL Server (4)
- [随笔分类][22] Enterprise Logs (3)
- [随笔分类][03] News (9)
- [随笔分类][19] Quality Assurance (2)
- [随笔分类][05] Silverlight (20)
- [随笔分类][14] Google Earth & .Net (6)
- [网站分类]非技术区 (9)
- [随笔分类][07] WWF (2)
- [随笔分类][04] SharePoint (1)
- [随笔分类][20] Analysis & Design (36)
- [随笔分类][06] WCF (5)
- [随笔分类][12] Architecture (1)
- [随笔分类][09] WPF (0)
- [随笔分类][17] VStudio & Expression (5)
最新评论
-
zhangyy130:
你好,我关于第二段的那个表视图、模型与图这三者的关系我没有看明 ...
UML模型的组成 -
guji528:
谢谢分享!
Enterprise Architect 基础应用 -
studentsky:
好文章,图文并茂!
WCF 第一个用 Visual Studio 2010 创建的WCF服务 -
chen975311486:
用哪个工具画的????
UML中对关系的描述 (二) -
frankies:
继续学习中。。
UML 交互概述图
简单工厂模式是解决了一个灵活通过方法封装 new 对象的操作,也就是解决对象创建问题。
下面的计算器实例,演示了通过方法根据条件利用多态的特性建立需要的业务对象执行对象特定的任务。
(在这里将全部引用大话设计模式中的例题代码和内容,劳动属于作者。)
书中有一个类图非常好,一目了然的说明类图的含义和标记 12页
计算器示例
逻辑组件(现在电脑粘贴乱码,所以粘贴黑白代码)
using System;
using System.Collections.Generic;
using System.Text;
namespace OperationLibrary
{
/// <summary>
/// 运算类,计算所用的父类
/// </summary>
public class Operation
{
private double _numberA = 0;
private double _numberB = 0;
/// <summary>
/// 数字A
/// </summary>
public double NumberA
{
get
{
return _numberA;
}
set
{
_numberA = value;
}
}
/// <summary>
/// 数字B
/// </summary>
public double NumberB
{
get
{
return _numberB;
}
set
{
_numberB = value;
}
}
/// <summary>
/// 得到运算结果,虚方法,子类重写
/// </summary>
/// <returns></returns>
public virtual double GetResult()
{
double result = 0;
return result;
}
/// <summary>
/// 检查输入的字符串是否准确
/// </summary>
/// <param name="currentNumber">文本框中显示的数字</param>
/// <param name="inputString">刚点击的数字</param>
/// <returns></returns>
public static string checkNumberInput(string currentNumber, string inputString)
{
string result = "";
if (inputString == ".")
{
//输入的是小数点
if (currentNumber.IndexOf(".") < 0)
{
//如果之前没有输入值,要在前面加上一个0
if (currentNumber.Length == 0)
result = "0" + inputString;
else
result = currentNumber + inputString;
}
}
else if (currentNumber == "0")
{
result = inputString;
}
else
{
//累加两个值
result = currentNumber + inputString;
}
return result;
}
}
#region 计算的子类
/// <summary>
/// 加法类
/// </summary>
class OperationAdd : Operation
{
//重写计算方法
public override double GetResult()
{
double result = 0;
result = NumberA + NumberB;
return result;
}
}
/// <summary>
/// 减法类
/// </summary>
class OperationSub : Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA - NumberB;
return result;
}
}
/// <summary>
/// 乘法类
/// </summary>
class OperationMul : Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA * NumberB;
return result;
}
}
/// <summary>
/// 除法类
/// </summary>
class OperationDiv : Operation
{
public override double GetResult()
{
double result = 0;
if (NumberB == 0)
throw new Exception("除数不能为0。");
result = NumberA / NumberB;
return result;
}
}
/// <summary>
/// 平方类
/// </summary>
class OperationSqr : Operation
{
public override double GetResult()
{
double result = 0;
result = NumberB * NumberB;
return result;
}
}
/// <summary>
/// 平方根类
/// </summary>
class OperationSqrt : Operation
{
public override double GetResult()
{
double result = 0;
if (NumberB < 0)
throw new Exception("负数不能开平方根。");
result = Math.Sqrt(NumberB);
return result;
}
}
/// <summary>
/// 相反数类
/// </summary>
class OperationReverse : Operation
{
public override double GetResult()
{
double result = 0;
result = -NumberB;
return result;
}
}
#endregion
/// <summary>
/// 运算类工厂
/// </summary>
public class OperationFactory
{
//根据参数判断要建立返回的那个类。
public static Operation createOperate(string operate)
{
//返回的对象
Operation oper = null;
switch (operate)
{
case "+":
{
oper = new OperationAdd();
break;
}
case "-":
{
oper = new OperationSub();
break;
}
case "*":
{
oper = new OperationMul();
break;
}
case "/":
{
oper = new OperationDiv();
break;
}
case "sqr":
{
oper = new OperationSqr();
break;
}
case "sqrt":
{
oper = new OperationSqrt();
break;
}
case "+/-":
{
oper = new OperationReverse();
break;
}
}
return oper;
}
}
}
Form界面使用
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using OperationLibrary;
namespace 计算器
{
/// <summary>
/// 面向对象编程
/// 1、加运算类
/// 2、加运算子类
/// 3、加运算类工厂
/// 4、更改Form1
public partial class Form1 : Form
{
bool bOperate = false;
Operation oper;//计算类
public Form1()
{
InitializeComponent();
}
private void button0_Click(object sender, EventArgs e)
{
//判断文本框有没有值,有值就清空
if (bOperate)
{
txtShow.Text = "";
bOperate = false;
}
string number = ((Button)sender).Text; //获得按钮文本,也就是数字
txtShow.Text = Operation.checkNumberInput(txtShow.Text, number);
}
private void buttonClear_Click(object sender, EventArgs e)
{
txtShow.Text = "";
}
/// <summary>
/// "+"按钮的操作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonAdd_Click(object sender, EventArgs e)
{
if (txtShow.Text != "")
{
oper = OperationFactory.createOperate(((Button)sender).Text);
oper.NumberA = Convert.ToDouble(txtShow.Text);
bOperate = true;
}
}
/// <summary>
/// “=” 按钮的操作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonEqual_Click(object sender, EventArgs e)
{
if (txtShow.Text != "")
{
if (((Button)sender).Text != "=")
{
oper = OperationFactory.createOperate(((Button)sender).Text);
}
oper.NumberB = Convert.ToDouble(txtShow.Text);
txtShow.Text = oper.GetResult().ToString();
bOperate = true;
}
}
}
}
控制台界面
using System;
using System.Collections.Generic;
using System.Text;
using OperationLibrary;
namespace 计算器控制台
{
class Program
{
static void Main(string[] args)
{
try
{
Console.Write("请输入数字A:");
string strNumberA = Console.ReadLine();
Console.Write("请选择运算符号(+、-、*、/):");
string strOperate = Console.ReadLine();
Console.Write("请输入数字B:");
string strNumberB = Console.ReadLine();
string strResult = "";
Operation oper;
oper = OperationFactory.createOperate(strOperate);
oper.NumberA = Convert.ToDouble(strNumberA);
oper.NumberB = Convert.ToDouble(strNumberB);
strResult = oper.GetResult().ToString();
Console.WriteLine("结果是:" + strResult);
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine("您的输入有错:" + ex.Message);
}
}
}
}
发表评论
-
享元模式(Flyweight)
2009-12-13 19:26 737重点概念 1. 这个模式相对简单。享元模式,就是在工厂 ... -
理解软件外包的种类
2009-12-17 21:11 503包项目 包人 包时间 -
解释器模式(Interpreter)
2009-12-20 14:02 584重要概念 1. 给定一个语言,定义它的文法的一种表示,并定义 ... -
访问者模式(Visitor)
2009-12-20 16:13 731重点概念 1. 双分派:得到执行的操作决定于请求的种类和接收 ... -
观察者(发布订阅)模式 与 委托事件
2009-12-02 17:07 964多一些宽容 重点概念 1. 开放封闭原则,修改原有代码就说 ... -
抽象工厂模式(Abstract Factory)
2009-12-02 22:20 1016开闭原则和依赖倒置原则是面向对象设计的重点,编程是一门艺术,大 ... -
状态模式(State)
2009-12-03 17:53 649重点概念 1. 方法内容如果过长其实就有可能出了问题。 2. ... -
适配器模式(Adapter)
2009-12-03 22:59 693适配器模式比较简单常 ... -
备忘录模式(Memento)
2009-12-06 10:59 681重点概念 1. 希望把存取状态的细节封装起来,而且最好是封装 ... -
组合模式(Composite)
2009-12-06 15:39 594重要概念 1. 将对象组合成树形结构以表示‘部分-整体’的层 ... -
迭代器模式(Iterator)
2009-12-06 16:48 867C# 中已经实现了迭代器功能, foreach in 和 IE ... -
单例模式(Singleton)
2009-12-06 19:55 749重点概念 1. 所有类都有构造方法,不编码则系统默认生成空的 ... -
大型网站性能优化的通用方法
2009-12-10 12:56 7461、HTML静态化其实大家 ... -
桥接模式(Bridge)与合成/聚合复用原则(CARP)
2009-12-13 12:40 1015重要概念 1.合成/聚合 ... -
命令模式(Command)
2009-12-13 14:16 725重要概念 1.命令抽象类,也是命令模式的核心理解 2. ... -
职责链模式(Chain of Responsibility)
2009-12-13 16:13 1067重要概念 1. 使多个对象都有机会处理请求,从而避免请求的发 ... -
依赖倒转(依赖倒置)原则
2009-11-30 15:23 7471. 抽象不应该依赖细节,细节应该依赖于抽象(接口,抽象类)。 ... -
装饰模式(Decorator)
2009-11-30 18:32 751重点概念 1. 把所需的功能按正确的顺序串联起来进行控制。 ... -
代理模式(Proxy)
2009-11-30 21:55 679大话设计模式讲的和连环画一样,还可以接上,作者真用心,看起来很 ... -
工厂方法模式(Factory Method)
2009-12-01 10:57 875重要概念 本章内容围绕简单工厂与工厂方法的比较很好的说明了工 ...
相关推荐
介绍的是工厂模式 包括简单工厂模式、工厂方法模式、抽象工厂模式 包括PPT和代码
java设计模式 简单工厂模式uml类图,一张图就让你秒懂简单工厂模式
JAVA设计模式(01):创建型-工厂模式【简单工厂模式】(Simple Factory)
运用两个典型案例,实现软件设计模式的简单工厂模式,从该案例中,可以体会简单工厂模式的特点
简单工厂模式,简单工厂模式课件,简单工厂模式PPT
反射例子代码、简单工厂模式例子代码、工厂模式例子代码
基于简单工厂模式的实例在安卓平台下。项目是AndroidStudio下的
C++简单工厂模式(设计绘图工具),如可创建圆形(Circle)、矩形(Rectangle)和三角形(Triangle)对象
本文章通俗易懂的对工厂模式进行了讲解,相信您看完这篇文章会对工厂模式有更深入的了解
设计模式之简单工厂模式案例
用简单工厂模式实现了一个商场收银小软件,用C++来做的
在vs2008SP1下使用标准C++编写的计算器程序 实现了加减乘除四则运算 功能虽然简单, 却也用到简单工厂模式, 还有一般学生不会去注意的异常处理 代码风格良好.
Java简单工厂模式和传统模式实现对比,通过简单实例比对两种方式差异,体现传统模式的弊端及工厂模式优势。利于初学者后续接触spring
该文件时对简单工厂模式的简单应用小例子,里面包含了对应的源代码
这是一个关于C#的简单工厂模式的实例,请大家多多更正和指教呢 呵呵
从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂...
简单工厂模式: 具体实现了一个计算器的代码,首先计算器应该具备对两个数字进行运算的功能,而运算的方法可以有很多种(最基础的有加,减,乘,除), 并且代码易于移植,这里是个console的应用台界面,也应该可以...