Factory,工厂。你想基于某个类去创建一个对象,你不直接去实例化这个类。而是通过一个工厂去帮你实例化需要的类来得到你需要的对象 .. 这个就是 Factory 设计模式 ..
下面用一个简单的例子来理解一下这种设计模式 .. 比如有个类叫 MountainBike ,山地自行车 .. 给它再添加一个方法 .. 名字是 hello .. 方法很简单,就是 return 一个字符串 .. hello ~ mountain bike.
现在我想得到一个山地车对象,可以这样 ... $bike 等于 new MountainBike ..
用一下 $bike 的 hello 方法 .. 输出执行这个方法的结果 ... 回到命令行 .. 执行一下 php factory.php ..
会输出一个 hello mountain bike.
工厂
如果使用工厂模式的话 ... 我们可以再去创建一个类 .. 比如名字是 BikeFactory ... 在它里面添加一个静态的方法 ... 这个方法的任务就是去创建需要的对象 .. 方法的名字可以是 create .. 或者 build .. 自己可以随便怎么去命名它 ..
这个方法会 return 一个对象 ... new MountainBike ..
比如现在我们我们需要一个 $bike 对象 .. 可以用一下 BikeFactory 的 build 这个静态方法给我们去创建 .. .
下面可以再用一下对象里的 hello 这个方法 .. 然后输出执行后的结果 ..
回到命令行。再试一下。同样会输出一个 hello ~ mountain bike.
使用工厂模式的好处就是 ... 如果说我们修改,重命名,或者替换了 MountainBike 这个类 ... 现在我们只需要修改工厂里这一个地方就行了 ..
还有个好处就是,如果实例化类的时候需要做很复杂的事儿,我们都可以把这些事儿放到工厂里去做 ... 不然你在实例化的时候,可能需要重复去做这些复杂的事儿 ..
现在我们再去创建一个类 ... 复制一下这个 MountainBike .. 类的名字是 RoadBike .. 表示公路自行车 .. 它里面的 hello 方法可以返回 hello ~ road bike ..
再改进一下这个 Factory .. 让 build 可以接收一个 $type 参数,表示要创建的自行车的类型 .. 里面添加一个 $bike .. 它的值是 $type 加上 Bike ..
再判断一下 .. 如果有 $bike 这个类 .. 我们就 return 一个 new $bike() ... 如果没有 ... 就 throw 一个 Exception ... Invalid bike type .
现在这个 Bikefactory 可以创建多个种类的自行车 .. 在用 build 方法的时候,给它一个参数 ... 指定一下要创建的自行车的类型 .. 先给它一个 Mountain .. 再输出执行 hello 返回的东西 ..
回到命令行 .. 进入到项目所在的目录 ... 可以执行一下 .. php factory.php .. 会输出 hello ~ mountain bike.
再修改一下 .. 这次给 build 一个 Road 参数 .. 回到命令行 .. 再执行一下 .. 这次会输出 hello ~ road bike ..
这次再给 build 一个错误的类型 ... 执行 ... 会提示 invalid bike type ..