您的位置:首页 > 其它

工厂模式

2015-09-14 15:04 155 查看
代码捆绑着具体类会导致代码脆弱,更缺乏弹性。

这是针对实现编程的设计,没有实现开闭原则,因此当需求变更时会带来大量的修改工作。至少我们要封装变化。



简单工厂没有真正解决问题,依然对修改开放,但是如果多个Store公用一个工厂,这样的话可以减少改动量,相当于函数层面的封装。



工厂方法通过子类实现了创建和客户的解耦,有两个方式引入工厂方法:
1. 为了使得设计既可以得到限制(所有PIZZA采用同样的订比萨流程),又能使设计更加具有弹性(不同比萨店制作不同风味比萨)
2. 使之与简单工厂相比更加对修改关闭对扩展开放,更具备灵活性,简单工厂将客户和工厂绑死在一块儿了。而工厂方法具备一定的灵活性。
Tips
1. 如果工厂做的工作是有严谨逻辑性的,比如(加,减,乘,除),这种情况如果修改逻辑比如增加求余运算增加简单工厂没有意义,必须修改简单工厂,这种情况工厂方法优势明显
2. 如果工厂做的工作没有严谨的逻辑性,如(加州风味比萨),这种情况增加简单工厂比修改简单工厂要好,工厂方法和增加简单工厂效果一致

简单工厂与工厂方法区别精辟:原本是由一个对象负责所有具体类的实例化,变为由一群子类来负责实例化。

工厂方法模式的定义:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

当一个函数即一个功能当中,有部分想继承又有一部分想多态,可以把多态的部分放在父类的抽象方法中延迟到子类实现。

工厂方法相当于把高层对低层组件的依赖变为低层对低层的依赖。



抽象工厂的引入:当产生纽约的CheesePizza时,运行到NYPizzaStore类的cheese分支,但相当于传入纽约口味参数,调用CheesePizza构造函数,然后调用prepare函数,函数中要构造三种原材料,三种原材料可以由多种口味比如纽约口味,芝加哥口味,这就又演变为对象的初始化,这时可以采用工厂方法,就变为面团有一个create面团虚函数,调味品有个create调味品虚函数,子类是纽约CheesePizza子类中有create纽约面团,create纽约调味品。这如果有其他如蔬菜比萨,还要有各个地方的蔬菜比萨子类,假设有三种比萨,三个地方,这样就需要12个子类(不同种类比萨加入不同的组成)。然而如果构建抽象工厂,纽约工厂生产所有纽约原材料,芝加哥工厂生产所有芝加哥原材料。则只需要7个类,当产生纽约的CheesePizza时,运行到NYPizzaStore类的cheese分支,传入纽约工厂,而CheesePizza有抽象工厂作为成员,将纽约工厂赋给抽象工厂,则生产出的原材料均为纽约口味的。这样可以显著地减少类的数量,同时保证了开闭原则开一家分店,配套建一座原材料工厂。(工厂方法相当于排列组合好后多态,抽象工厂相当于排列组合的过程中多态,所以抽象工厂的类个数少)

抽象工厂用来创建产品家族,其定义为:抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确制定具体类。

抽象工厂的问题是,当增加产品的时候,需要改变每个工厂,每个客户。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: