大话设计模式学习篇--简单工厂模式
2015-11-22 22:02
295 查看
1 以一个计算器例子引入
将数据的输入和计算(加减乘除等)都写入主函数体内,代码难以得到复用。2 业务封装
将业务逻辑(计算逻辑)与界面输入分隔开,将业务逻辑独立到类当中。3 业务的继承与多态
在第二部分,计算逻辑被独立在一个类当中,实现了封装,但这还远远不够。现实情况下,业务逻辑通常会发生变化,如果整体的业务逻辑均放在一个类下,那么业务的修改将面临很多风险。这个时候,可采用继承和多态的方式解决。首先,对业务逻辑(计算过程)实现抽象;之后,让各个过程继承这一抽象,并独立实现;最终,当需要增加新逻辑时,只需继承这一抽象,并独立实现自己的逻辑。4 简单工厂模式
用一个独立的类来完成实例的创建。简单工厂模式实际上是对实例化的细节进行封装。下面是一个比较好的例子,摘自博客:http://blog.csdn.net/aspnet2002web/article/details/5874405using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace LxFactory { //声明一个人类接口 interface Ihuman { void getFav(); //声明未实现的爱好方法getFav() string getStatus(); //声明未实现的身份状态(孩子,成年人)方法 } //声明一个抽象类Children,并实现接口的部分方法 abstract class Children : Ihuman { protected string _status = "孩子"; //实现接口Ihuman中的getStatus()方法 public string getStatus() { return _status; } //将接口Ihuman中的getFav()方法映射到抽象方法 abstract public void getFav(); } //声明一个抽象类Adult,并实现接口的部分方法 abstract class Adult : Ihuman { protected string _status = "成年人"; //实现接口Ihuman中的getStatus()方法 public string getStatus() { return _status; } //将接口Ihuman中的getFav()方法映射到抽象方法 abstract public void getFav(); } //声明男孩类Boy,继承小孩类Children,重写爱好方法getFav() class Boy : Children { public override void getFav() { Console.WriteLine("男孩,我喜欢游戏!"); } } //声明女孩类Girl,继承小孩类Children,重写爱好方法getFav() class Girl : Children { public override void getFav() { Console.WriteLine("女孩,我喜欢布娃娃!"); } } //声明男人类Man,继承成人类Adult,重写爱好方法getFav() class Man : Adult { public override void getFav() { Console.WriteLine("男人,我喜欢编程!"); } } //声明女人类Woman,继承成人类Adult,重写爱好方法getFav() class Woman : Adult { public override void getFav() { Console.WriteLine("女人,我喜欢逛街!"); } } //声明一个抽象工厂,分别创建相应类的实例 abstract class HumanFactory { protected Ihuman h1 = new Boy(); protected Ihuman h2 = new Man(); protected Ihuman h3 = new Girl(); protected Ihuman h4 = new Woman(); //创建一个方法,根据不同输入返回一个接口的引用 abstract public Ihuman getHuman(int i); } //声明可以实例化各种类的工厂Factory1,继承类HumanFactory,重写抽象方法getHuman() class Factory1 : HumanFactory { //根据不同输入获得不同对象所属接口的引用 public override Ihuman getHuman(int i) { switch (i) { case 1: return h1; case 2: return h2; default: return h1; } } } //声明可以实例化各种类的工厂Factory1,继承类HumanFactory,重写抽象方法getHuman() class Factory2 : HumanFactory { //根据不同输入获得不同对象所属接口的引用 public override Ihuman getHuman(int i) { switch (i) { case 1: return h3; case 2: return h4; default: return h3; } } } public class LxFactory { static void Main(string[] args) { //使用工厂1 Console.WriteLine("男性中有两种人,请选择编号【1】男孩【2】男人:"); int input1 = Int32.Parse(Console.ReadLine()); Factory1 f1 = new Factory1(); Ihuman h1 = f1.getHuman(input1); h1.getFav(); Console.WriteLine("我的身份是:{0}", h1.getStatus()); //使用工厂2 Console.WriteLine("女性中有两种人,请选择编号【1】女孩【2】女人:"); int input2 = Int32.Parse(Console.ReadLine()); Factory2 f2 = new Factory2(); Ihuman h2 = f2.getHuman(input2); h2.getFav(); Console.WriteLine("我的身份是:{0}", h2.getStatus()); } } }
相关文章推荐
- hdu 4512 吉哥系列故事——完美队形I(LICS)
- 利用匿名管道实现远程调用CMD
- java
- 第一次blog 发发牢骚
- leetcode Power of Two
- 浅谈协方差矩阵
- 基于stm32的遥控小船(一)L298N电机驱动
- cocos2d-x添加控制台日志输出
- Django-简单项目创建
- [AlwaysOn Availability Groups]AlwaysOn Ring Buffers
- scala的futue和promise
- Java单元测试问题
- POJ 1159 DP+滚动数组
- 在VS2013中调试mex文件
- C++virtual继承
- 信息安全系统设计基础第十一周学习总结
- Android手机投影到电脑屏幕的神兵利器
- 开源的力量--Git中工作区与暂存区的区别
- svn 常用命令
- 树莓派添加RTC时钟模块的方法