潜移默化学会设计模式-《1》-简单工厂模式《搭积木的例子》
一下内容皆是个人想法,只是希望将专业的东西,转化成通俗的东西,不想含有啰嗦的成分
1.学前故事:
看了3,4个简单工厂的例子,映像最深的还是那个计算器(好像还是微软的一道面试题"计算器,用OOP实现")
说实话,再讲模式之前,记住两个公式: (接口命名规范,名称前面加个“ I ”)
IA ic=new C;
IA id=new D;
当参数是 IA类型时,ic,id当然都能传入,当ic调他里面的方法和属性时是C里面的,而id调他里面的方法和属性时是D里面的
这就是多态了,如果记不住,请记住模糊的感觉,心里知道,说不出来没关系
父类 a=new 子类1;
父类 a=new 子类2;
跟上面是一样的道理
有个专业术语,叫"里氏替换原则",讨厌专业的
这就是传说中的他们的多态了,掌握这个,java 的oop跟这个一模一样,记住这种感觉,对学习设计模式是很重要的。
相关知识点: C# OOP C# 接口 C# 继承 C# 多态 C#封装
2.开始学习 (以下内容采用第二个公式) 不想用计算器的例子,好俗~
想啊想~想啊想~
《搭积木》吧,小时候幼儿园的一个游戏,好怀念~
组件:各种形状的木头
动作:拿起积木搭建
首先新建一个控制台应用程序
①新建一个Wood 类,木头的总称,来基本定它的子类的模样,如果 关于 Virtual 关键字不懂的,建议先去学学oop
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleFactoryDemo { public class Wood { /// <summary> /// 木头形状 /// </summary> public string WoodShape { get; set; } /// <summary> /// 木头颜色 /// </summary> public string WoodColor { get; set; } public virtual void StartBuild() { Console.WriteLine("你拿起了" + WoodColor + "的" + WoodShape + "的积木..."); Console.WriteLine("成功了!"); } } }
然后我们开始做第一块木头,黄色的圆形的木头
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleFactoryDemo { public class RoundWood:Wood { public override void StartBuild() { WoodColor = "黄色"; WoodShape = "圆形"; base.StartBuild(); } } }
同理我们多做几块
白色的方形的木头
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleFactoryDemo { public class SquareWood:Wood { public override void StartBuild() { WoodColor = "白色"; WoodShape = "方形"; base.StartBuild(); } } }
灰色的拱形木头
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleFactoryDemo { public class ArchWood:Wood { public override void StartBuild() { WoodColor = "灰色"; WoodShape = "拱形"; base.StartBuild(); } } }
好了,搭积木的原材料都有了,此时我们有三块木头了
但事实上我们根本不止三块木头,以后可能还有其他形状的其他颜色的木头,为了方便能有更多的木头,我们需要一个工厂来生产这个木头,说白了,其实是为了我们来拿木头搭建的时候更轻松,方便打下基础,拿木头的时候你就知道了
我们來建一个木头工厂吧
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleFactoryDemo { public class Factory { public static Wood CreateWood(string shape) { Wood newWood = null; switch (shape) { case "圆形": newWood = new RoundWood(); break; case "方形": newWood = new SquareWood(); break; case "拱形": newWood = new ArchWood(); break; default: break; } return newWood; } } }
我这里只是根据形状来生产木头的,没有颜色,如果你想还能控制颜色你还可以加个颜色作为判断,来构成 我们的 第二个公式的样子
父类 a=new 子类1;
父类 a=new 子类2;
好了,到此为止,木头有了,哦,说错了,是积木;
积木有了,生产积木的工厂也有了,那现在搭你想要搭的东西吧
在Program.cs文件里,我是这样写的
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleFactoryDemo { class Program { static void Main(string[] args) { Wood factory = Factory.CreateWood("方形"); factory.StartBuild(); Console.ReadLine(); } } }
效果
如果不考虑定死的颜色,我们现在只需要把”方形“改成 我们身边现有的形状,工厂就可以帮你生产出该形状的积木,说生产太那个了,就是创建一个有形状的积木对象给你,然后你掉这个积木的方法就行了,
用简单工厂模式,可以方便某种情况的拓展,而你并不知道这些情况共有多少个,这有情况都要有某些共同之处,就可以了
在看一下吧
Wood factory = Factory.CreateWood("方形"); factory.StartBuild(); Wood factory1 = Factory.CreateWood("拱形"); factory1.StartBuild(); Wood factory2 = Factory.CreateWood("圆形"); factory2.StartBuild(); Console.ReadLine(); }
效果图
其他例子:例如 两位数计算的计算器,用工厂创建运算方法,例如+-×÷/...
我的应用拓展:结账方式有很多,用工厂创建各种结账方式,前台调用时只要传个结账方式的名称:就可以创建那个结账方式的对象,给你调用该结帐方式的方法或者属性,以后有什么新的结账方式,添加就行了。
还有分开写类比较安全,例如 你不想某些人看到你写的某种方式的结账算法,简单工厂是很好的选择,别人只要新建一个类,写他的方法就行了,然后你在工厂那个类中添加一个结账方式就行了。
最后露一个项目结构图吧
demo下载:http://download.csdn.net/detail/yangyanghaoran/4327225