C#工厂模式代码实例
此处示例为一个简易计算器工厂模式的实现.
创建类库,名为CalcLib,我把计算功能全部放在这个类库中.
首先,创建一个抽象的计算器算法父类,如下:
/// <summary>
/// 计算器算法父类
/// </summary>
public abstract class Calculator
{
public Calculator()
{
}
//给子类的参数
public Calculator(double n1, double n2)
{
this.Number1 = n1;
this.Number2 = n2;
}
public double Number1 { get; set; }
public double Number2 { get; set; }
/// <summary>
/// 抽象计算方法
/// </summary>
/// <returns>result</returns>
public abstract double Compute();
}
父类创建完毕后,我们在子类来实现具体的加减乘除
加法类:
/// <summary>
/// 加法
/// </summary>
public class CalAdd:Calculator
{
public CalAdd(double n1, double n2)
:base(n1,n2)
{
}
public override double Compute()
{
return Number1 + Number2;
}
}
减法类:
/// <summary>
/// 减法
/// </summary>
public class CalSub:Calculator
{
public CalSub(double n1, double n2)
:base(n1,n2)
{
}
public override double Compute()
{
return Number1 - Number2;
}
}
乘法类:
/// <summary>
/// 乘法
/// </summary>
public class CalMul:Calculator
{
public CalMul(double n1, double n2)
:base(n1,n2)
{
}
public override double Compute()
{
return Number1 * Number2;
}
}
除法类:
/// <summary>
/// 除法
/// </summary>
public class CalDiv : Calculator
{
public CalDiv(double n1, double n2)
: base(n1, n2)
{
}
public override double Compute()
{
return Number1 / Number2;
}
}
OK,需要的计算方法都创建完毕了,现在,我们来创建主程序,这里呢我创建一个控制台程序,名为MyCalculator,然后呢在Program类中添加一个静态的计算工厂方法。
/// <summary>
/// 计算工厂
/// </summary>
/// <param name="n1">操作数1</param>
/// <param name="op">符号</param>
/// <param name="n2">操作数2</param>
/// <returns>计算结果</returns>
static Calculator Cal(double n1, string op, double n2)
{
Calculator cal = null;
switch (op)
{
case "+":
cal = new CalAdd(n1, n2);
break;
case "-":
cal = new CalSub(n1, n2);
break;
case "*":
cal = new CalMul(n1, n2);
break;
case "/":
cal = new CalDiv(n1, n2);
break;
default:
break;
}
return cal;
}
最后呢我在Main方法中添加了以下代码:
static void Main(string[] args)
{
Console.Title = "简易计算器";
Console.WindowWidth = 37;
Console.WindowHeight = 10;
Console.ForegroundColor = ConsoleColor.Green;
while (true)
{
try
{
Console.Clear();
Console.WriteLine("请输入操作数1:");
double n1 = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("请输入操作符:");
string op = Console.ReadLine();
Console.WriteLine("请输入操作数2:");
double n2 = Convert.ToDouble(Console.ReadLine());
Calculator cal = Cal(n1, op, n2);
if (cal != null)
Console.WriteLine("计算结果为:{0}", cal.Compute());
Console.WriteLine("再次按回车继续计算...");
Console.ReadLine();
}
catch { break; }
}
}
OK,一个简单的工厂模式实现就完成了,用工厂模式首先呢要有一个公用的抽象意义,然后再来使用,新功能无需更改任何代码,只需要新增一个类,基础父类,然后实现你要得功能就可以了,有点类似于浏览器和插件。
C#工厂模式代码实例的更多相关文章
- php设计模式之简单工厂模式代码实例
<?php header("Content-type:text/html;charset=utf-8"); /** * 共同接口 */ interface db { func ...
- java 抽象工厂模式简单实例
抽象工厂模式:提供一个创建一系列的相关的或者依赖的对象的接口,无需指定它们的具体实现类,具体的时间分别在子类工厂中产生. 类似于工厂模式:隔离了具体类的生产实现,使得替换具体的工厂实现类很容易.包含有 ...
- php工厂模式的实例
* 单例模式:用于创建单一类型的唯一实例对象 * 工厂模式:用于创建多种类型的多个实例对象 //声明形状类 class Shape { //声明静态方法create,根据容器形状不同,创建不同图形类的 ...
- JavaScript工厂模式代码
function createPerson(name,age,job){ var o=new Object(); o.name=name; o.age=age; o.job=job; o.sayNam ...
- C# 设计模式之工厂模式(一)
写在前面,PS一句:笔记专用,轻拍勿喷,看的不爽绕路前行即可. 一.举栗说明 1.剧情:某银行财务有三位员工,分别为A.B.C三人,主要任务就是去银行取钱,如下: class EmloyeeA: { ...
- JAVA设计模式之工厂模式
工厂模式概念: 实例化对象,用工厂方法代替new操作 工厂模式包括工厂方法模式和抽象工厂模式 抽象工厂模式是工厂方法模式的扩展 工厂模式的意图: 定义一个接口来创建对象,但是让子类来决定哪些类需要被实 ...
- JS中的工厂模式
.一个栗子: var BicycleShop = function(){}; BicycleShop.prototype = { sellBicycle : function( model ){ va ...
- 学习:java设计模式—工厂模式
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Facto ...
- Java设计模式02:常用设计模式之工厂模式(创建型模式)
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Fact ...
随机推荐
- Android学习笔记之viewholder
在adapter中通过使用静态内部类(viewholder)缓存组件的引用来防止ListView刷新时重新LayoutInflater跟findViewById从而达到优化的目的.示例如下: @Ove ...
- 前端 HTML基础
前端三大利器概述 学习前端,不得不学习前端中的三大利器:html + css + javascript.那么这三个组件分别起到什么作用呢?以人体为例,单单具有html属性的人,只是一个裸体的人偶(理解 ...
- “=”号和“:”的区别,Html.Raw()的使用
“=”号,将原封不动输出字符串到页面 “:”号:将字符串进行编码后输出到页面 public ActionResult HtmlEncodeDemo() { ViewData["strScri ...
- Ubunte 11.4 下安装 SSH遇到的问题
第一次安装报了一堆错,主要是也http 404 not found之类的,搜索了一番怀疑是apt的source list的问题. 网上找到一份替换之,我用的是搜狐的服务器.网址如下: http://b ...
- a标签的onclick和href事件的区别
在执行顺序上href是低于onclick的,那么这个会造成什么影响呢 <div onclick="a()"> <a href="#" oncl ...
- ios中模拟延时的几种方法
- (void)delay1 { // 延迟执行不要用sleep,坏处:卡住当前线程 [NSThread sleepForTimeInterval:3]; NSLog(@&qu ...
- 《Hadoop权威》学习笔记四:Hadoop的I/O
一.数据完整性 二.压缩 三.序列化 基本概念 序列化指的是将结构化对象转化为字节流以便于通过网络进行传输或写入持久化存储的过程 反序列化指的是将字节流转为一系列结构化对象的过程. 进程间通信 ...
- Word隐藏回车符技巧
每一次在Word中敲击回车时,都会留下一个回车符,回车次数多了回车符也就跟着变多了,这的确是太影响视觉效果了,我们要如何操作才能将这些回车符去掉呢?特意为大家献上Word2003和Word2007中隐 ...
- svn的使用--解决commit冲突问题
1.如何降低冲突解决的复杂度: 1.当文档编辑完成后,尽快提交,频繁的提交/更新可以降低在冲突发生的概率,以及发生时解决冲突的复杂度. 2.在提交时,写上明确的message,方便以后查找用户更新的原 ...
- ON UPDATE CURRENT_TIMESTAMP
CREATE TABLE time1 ( id SMALLINT, time1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TI ...