最近在看大话设计模式,一直都把里面的代码都自己亲手敲一遍去理解这些设计模式的含义,而且都在做着笔记,但是寻思着。应该拿出来和大家一起交流共享,更希望大家能够指出不足。所以打算把这些东西拿出来大家一起点评点评。
之后的内容都纯属个人理解,希望不会误导别人。
今天先说说第一个,简单工厂模式。
我们举个简单的例子,很多人再讲简单工厂模式的时候相比都是会拿这个案例来做例子,计算器。
我们设计一个简单的计算器,只需要实现加减乘除这四个功能即可。
对于面向过程的思维来看,加减乘除无非是四个方法,我们写好这几个方法,然后传入参数,获取返回值即可。
但是我们如果用面向对象的思想来看,加减乘除其实都是一个对象,而这个对象的父类,其实就是 运算(Operation) 。
所以我们可以定一个抽象类,让加减乘除都来继承这个父类(Operation)在父类中我们给出一个方法,就叫做OperationNum吧。
参数两个,分别是要计算的两个数,返回值 返回计算后的结果。
加减乘除继承了这个父类,并且实现具体的计算方法。这时候,我们怎么来用简单工厂呢?
我们建立一个工厂静态类,这个类中有一个静态方法,参数是运算符,
根据用户输入的运算符,我们来在工厂产生相对应的子类,然后以父类的姿态返回他,然后客户端代码只需要调用这个父类对象的OperationNum方法即可。
这里涉及到里氏转换原则,里氏转换原则如下:
1.子类对象可以直接赋值给父类变量
2.父类对象可以强制类型转化为【对应的】
子类对象(重要)
子类扩展的方法和属性 转换为父类时候
父类访问不到,但是再强制转换为对应的子类时候会再次显示。因为在转换父类的时候被隐藏了
红薯的例子,把红薯装在一个食品盒子里,虽然从外观上发生了变化,但是本质它还是一个红薯。当我们拆开这个食品盒子,得到的也只能是红薯而不可能是其他的食物。
相当于打一个包
本质没有变化
下面给出一个图,来帮助大家理解这个简单
下面再给出一些代码帮助大家理解
1
2
3
4
5
6
7
8
9
10
11
12
13
14 |
//抽象父类 using
System; using
System.Collections.Generic; using
System.Linq; using
System.Text; using
System.Threading.Tasks; namespace
计算器抽象 { abstract
class Operation { public
abstract int Run( int
num1, int
num2); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 |
//加减乘除子类,只给出一个方便理解 using
System; using
System.Collections.Generic; using
System.Linq; using
System.Text; using
System.Threading.Tasks; namespace
计算器抽象 { class
Cut:Operation { public
override int Run( int
num1, int
num2) { return
num1 - num2; } } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 |
//工厂类 using
System; using
System.Collections.Generic; using
System.Linq; using
System.Text; using
System.Threading.Tasks; namespace
计算器抽象 { class
FactoryClass { static
Operation op = null ; public
static Operation Panduan( string
mark) { switch
(mark) { case
"+" : op = new
Add(); break ; case
"-" : op = new
Cut(); break ; case
"*" : op = new
Ride(); break ; case
"/" : op = new
Division(); break ; default
:; break ; } return
op; } } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 |
//客户端代码 using
System; using
System.Collections.Generic; using
System.Linq; using
System.Text; using
System.Threading.Tasks; namespace
计算器抽象 { class
Program { static
void Main( string [] args) { Console.WriteLine( "请输入第一个数:" ); int
num1 = int .Parse(Console.ReadLine()); Console.WriteLine( "请输入第二个数:" ); int
num2 = int .Parse(Console.ReadLine()); Console.WriteLine( "请输入运算符:" ); string
mark = Console.ReadLine(); Operation opc = FactoryClass.Panduan(mark); if
(opc != null ) { Console.WriteLine(opc.Run(num1, num2)); } else { Console.WriteLine( "无效的运算符!" ); } Console.ReadKey(); } } } |
本人尚在学习阶段,希望有写的不好的地方,大家指正。
原文:http://www.cnblogs.com/ruhuaxiao/p/3610437.html