《设计模式 - 工厂模式》
新功能终于今天提测,送了一口小气~
一:什么是工厂模式?
- 所谓工厂模式,就是有一种工厂的思维,通过工厂一系列的操作,生成的统一的对象。
- 工厂模式的出现就是为了解决代码之间的耦合度,通过 “工厂出去” 的对象,可以更方便的进行类的 修改/添加/删除 等等,而不需要大规模的去修改代码。
- 工厂模式简单分为 简单工厂/工厂方法,下面会去讲一下他们的使用和区别
二:简单工厂模式?
- 简单工厂就和他的名字一样,虽然简单,但是却有着很大的作用。
- 最大的优点在于,工厂类中包含了必要的逻辑判断,值通过客户端的选择去动态的实例化。
- 对于客户端来说,这样去除与具体产品的依赖。
- 就像下面这个简单计算器一样,客户端只需要传对应的条件就可以,工厂会自动给出相对的实例,客户端并不需要知道工厂做了什么
// 简单计算器实例
class easyFactory { public function CreateOpera($type) { switch ($type) { case '+': return new 加法类(); break; case '-': return new 减法类(); break; case '*': return new 乘法类(); break; } } } $opera = new easyFactory(); // 加法 $instance = $opera->CreateOpera('+'); // 减法 $instance = $opera->CreateOpera('-'); // 乘法 $instance = $opera->CreateOpera('*');
三:工厂模式
- 简单工厂模式,适用于条件变化不是很多的 Case, 在频繁的开放扩展中,也修改工厂类,这样也就违反了 面向对象原则 :开放-封闭原则
- 于是,工厂模式就出现了。
- 定义:定义一个用于创建对象的接口,让子类决定实例化到那个类,工厂方法使得实例化一个类延迟到子类。
- 简单来说,就是由客户端来决定实例化那个,把逻辑放到了客户端中。这样也就避免了去修改工厂函数,而对工厂的开放扩展
// 工厂方法 interface Factory { function getOpera(); } class Add implements Factory { public function getOpera(argument) { return new 加法类(); } } class Reduce implements Factory { public function getOpera(argument) { return new 减法类(); } } class Ride implements Factory { public function getOpera(argument) { return new 乘法类(); } } // 加法 $opera = new Add(); $instance = $opera->getOpera('+'); // 减法 $opera = new Reduce(); $instance = $opera->CreateOpera('-'); // 乘法 $opera = new Ride(); $instance = $opera->CreateOpera('*');