简单工厂 vs 工厂方法
来源:互联网 发布:linux oracle sqlplus 编辑:程序博客网 时间:2024/06/03 17:07
设计模式中,工厂三姐妹还是比较重要的,现在我们来谈谈他们的故事。
简单工厂模式:
客户端的实现需要依靠的是父类和工厂这个类,所以就把子类封装在父类里面,客户端直接调用父类和工厂类就可以了;但是工厂类还需要依赖于父类。我们假设父类为bird,子类分别为little bird和 big bird,而父类代码和子类的代码分别如下:
public abstract class Bird { public abstract void Fly(); } public class LittleBird : Bird { public override void Fly() { Console.WriteLine("小鸟在飞"); } } public class BigBird : Bird { public override void Fly() { Console.WriteLine("大鸟在飞"); } }
同时我们需要写工厂类:
public class Factory { public static Bird CreateBird(string BirdType) { Bird bird = null; switch (BirdType) { case "LittleBird": bird = new LittleBird(); break; case "BigBird": bird = new BigBird(); break; } return bird; } }
在客户端中,我们需要做的就是利用调用工厂类和父类中的方法:
class Program { static void Main(string[] args) { Bird bird = Factory.CreateBird("BigBird"); bird.Fly(); } }
显示结果为:大鸟在飞。
简单工厂模式中在工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态的实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
工厂方法模式:
定义一个用于创建对象的接口,让子类决定实例化那一个类,工厂方法使一个类的实例化延迟到其子类。
由图可知,工厂类的子类有俩个,父类也是有俩个的,也就是bird中俩个子类分别是littlebird和bigbird,上面的代码已经给出,这里不再重复。但是这里还需要写工厂类和他的工厂的子类们,还有客户端中的代码,具体如下:
构建一个 工厂的接口:
interface IFactory { Bird CreateBird(); }
然后就可以写工厂的子类啦,去实现这个接口。
class LittleFactory : IFactory { public Bird CreateBird() { return new LittleBird(); } } class BigFactory : IFactory { public Bird CreateBird() { return new BigBird(); } }
最后在客户端的实现中写:
class Program { static void Main(string[] args) { IFactory a = new LittleFactory(); Bird LittleBird = a.CreateBird(); a.CreateBird(); } }
就这样,简单模式通过了抽象接口和具体的子抽象具体的接口,实现了工厂方法模式。工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行啦。
自己管理自己的工厂就是简单工厂,而通过一个工厂的抽象接口来管理,就是工厂方法。下篇将介绍抽象工厂。刚刚学习,认识肤浅,还望指教。
0 0
- 简单工厂VS工厂方法
- 简单工厂VS工厂方法
- 简单工厂 VS 工厂方法
- 简单工厂VS工厂方法
- 简单工厂 vs 工厂方法
- 简单工厂VS工厂方法
- 简单工厂 VS 工厂方法 VS 抽象工厂
- 简单工厂VS工厂方法VS抽象工厂
- 简单工厂VS工厂方法VS抽象工厂
- 简单工厂模式 VS 工厂方法模式
- 简单工厂模式vs工厂方法模式
- 工厂方法模式VS简单工厂
- 简单工厂模式 VS 工厂方法模式
- 简单工厂模式VS工厂方法模式
- 简单工厂模式VS工厂方法模式
- 【设计模式】简单工厂VS工厂方法
- 【设计模式】简单工厂VS工厂方法
- 工厂方法模式VS简单工厂模式
- 【笔记】Java编程思想——对象的集合
- 内存分配:栈内存 堆内存
- 【php】注册系统和使用Xajax即时验证用户名是否被占用
- 解决本机不能访问虚拟机web服务器网站的问题
- duilib底层机制剖析:窗体类与窗体句柄的关联
- 简单工厂 vs 工厂方法
- Andrey and Problem
- UVA 10369(求第K长的边,kruskal算法模板)
- ECshop彻底去版权(同时适用于2.7.3) 前台部分: 1:去掉头部TITLE部分的ECSHOP演示站 Powered by ecshop 前者”ECSHOP演示站
- 第16周上机实践项目2--有相同数字?
- 数据结构(c++)魔术师发牌问题
- JAVA注解
- 关于MySQL数据库设计的几点优化措施
- WampServer配置