简单工厂Pk工厂方法
来源:互联网 发布:python random.choice 编辑:程序博客网 时间:2024/04/29 18:30
工厂,顾名思义就是用来生产产品的地方。而在设计模式中提到的工厂是什么意思呢?设计模式中提到了三种工厂模式:简单工厂模式、抽象工厂模式、工厂方法模式,他们有什么共同点和区别呢?下边就来总结一下设计模式中的工厂家族
1 简单工厂模式
1.1定义:
简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
1.2 UML类图
抽象产品:这里的抽象产品可以是抽象类也可以是接口
具体产品:简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。
工厂角色:这是简单工厂的核心部分,由它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。
1.3 UML实例
首先写出运算类(这是一个抽象类),他有两个Number属性,有一个GetResult的虚方法,用于得到结果。加减乘除是它的子类,继承他后,重写GetResult方法(因为是抽象类只提供虚方法,每个子类的方法各部不相同,所以需要对继承父类的方法进行重写)。而简单工厂的作用是:作为一个单独的类去实现子类的实例化过程。
运算类:
class Operation //运算类 { private double _numberA = 0; private double _numberB = 0; public double NumberA { get { return _numberA; } set { _numberA = value; } } public double NumberB { get { return _numberB; } set { _numberB= value; } } public virtual double GetResult() //vitual 用来声明虚方法,可被子类重写 { double result=0; return result; }
加法类(其余三个雷同,省略)
class OperationAdd:Operation //加法类 { public override double GetResult() //对父类方法进行重写 { double result = 0; result = NumberA + NumberB; return result; } }
简单工厂类:
class OperationFactory { public static Operation createOperate(string operate) // createOperate是静态方法,返回值是Operation,不需要实例化对象就可以使用 { Operation oper = null; switch (operate ) { case "+": oper = new OperationAdd(); break; case "-": oper = new OperationSub(); break; case "*": oper = new OperationMul(); break; case"/": oper = new OperationDiv(); break; } return oper; } }
客户端
Operation oper; oper = OperationFactory.createOperate("-"); oper.NumberA = 1; oper.NumberB = 3; double result = oper.GetResult();
1.4 应用场景
1.5 自己的理解
简单工厂就是给他传进去原材料,他就可以生产出客户需要的产品,而客户并不需要知道这个产品是如何生产的。例如去餐厅点餐,餐厅就相当于是一个简单工厂,食品看做抽象类,宫保鸡丁,鱼香肉丝等等是具体的产品,你要什么,他就会生产出什么,而你不需要知道他是怎么做出来的。
总结一句话:简单工厂将消费者与建造者分离,有利于系统的优化。但是因为只有一个工厂类,所有的逻辑判断都集中在在这一个类中,如果他不能正常工作就会影响到客户端。
2 工厂方法
2.1定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个实例化延迟到子类
2.2 UML图
2.3 UML实例
工厂接口:
interface IFactory { Operation CreateOpertation(); //唯一的一个方法就是创建产品对应的工厂类 }
具体工厂类:(加法:其他雷同就不贴了)
class AddFactory:IFactory { public Operation CreateOperation() //加法类工厂,去实现IFactory接口 { return new OperationAdd(); } }
客户端:
IFactory operFactory = new AddFactory(); Operation oper = operFactory.CreateOpertation(); oper.NumberA = 1; oper.NumberB = 2; double result = oper.GetResult();
2.4 应用场景
A:对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。
B:只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。(来自百科)
2.5 自己的理解
工厂方法是简单工厂进一步的抽象,把工厂类抽象成一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法。所有要生产具体类的工厂,就去实现这个接口。原来简单工厂只是对产品抽象出一个产品类,让具体产品去继承,现在我们把工厂类也进行了抽象,派生出多个具体的工厂类,这样在增加功能使,就不会对原来的工厂类直接进行修改,而是扩展出一个新的工厂子类。
简单工厂和工厂方法的对比
- 简单工厂Pk工厂方法
- 简单工厂模式PK工厂方法模式
- 工厂方法PK抽象工厂
- 简单工厂模式与工厂方法模式大PK
- 工厂方法模式和简单工厂模式PK
- 简单工厂,工厂方法
- 简单工厂/工厂方法/抽象工厂
- 简单工厂、工厂方法、抽象工厂
- 简单工厂,工厂方法,抽象工厂
- 简单工厂、工厂方法、抽象工厂模式
- 简单工厂 工厂方法 抽象工厂
- 简单工厂、工厂方法、抽象工厂
- 简单工厂、工厂方法、抽象工厂
- 简单工厂、工厂方法和抽象工厂
- 简单工厂、工厂方法、抽象工厂
- 简单工厂、工厂方法、抽象工厂模式
- 简单工厂,工厂方法,抽象工厂
- 简单工厂&工厂方法&抽象工厂
- MyBatis 缓存机制深度解剖 / 自定义二级缓存
- ZooKeeper-3.3.4集群安装配置
- solr乱七八糟总结,真的很乱
- Android之AlertDialog详解
- extjs简单左边树形菜单布局
- 简单工厂Pk工厂方法
- OC中的runtime运行时
- 数据库复习笔记
- hdu 5534 Partial Tree 2015长春区域赛 dp 脑洞
- Android动画学习笔记-Android Animation
- iOS导航栏 如果只想改变单一自控制导航栏按钮 标题颜色 请进
- 基于ZooKeeper的Dubbo注册中心
- 如何使用javadoc
- App installation failed A valid provisioning profile for this executable was not found.