该模式属于创建型模式
说句老实话,工厂模式对于个人来说真没什么鸟用,就省了一个new而已,但是很多框架的源码里却随处可见工厂模式的身影。
一、什么是工厂模式?
从名字来看,似乎看不出什么端倪。工厂模式,和生产有关?还是和生产流程有关?难道还和工厂领导有关?和领导秘书有关?秘书... 好了不卖关子了,所谓工厂模式还真和生产有关。生产什么呢?生产出来的是一个实例对象。通过什么设备生产?通过一个工厂类生产。怎么生产呢?工厂类调用自身静态方法来生产对象实例。
工厂模式有一个关键的构造,根据一般原则命名为Factory的静态方法,然而这只是一种原则,虽然工厂方法可以任意命名这个静态还可以接受任意数据的参数,必须返回一个对象。
工厂模式的原理就是创建一个类(我们叫工厂类),这个类用来专业生产各个类的对象,做法很简单,在工厂类里写一个静态方法,这个静态方法接收一个参数,根据传进来的参数来确定到底是new那个类的对象。
感觉上面说的很抽象 很专业?那用大白话来解释一下?如下:
就是负责创建其它对象的类或方法。
1、工厂模式大概步骤如下:
①、接口中定义一些方法。注:有的人可能不是使用的interface(接口)最终都要而是使用的abstract(抽象)也是可以的,反正最终都要实现接口类中的方法或抽象类中的抽象方法。
②、实现接口类中定义的接口方法
③、工厂类:用来创建对象
2、优缺点:
优点:为系统结构提供了灵活的动态扩展机制,降低了类之间的耦合度。方便维护
缺点:当要修改类的时候,工厂类也需要做出相对应的更改,违反了开闭原则(对于扩展代码开放,对于类内修改关闭)
工厂模式示例代码:
<?php interface Skill { public function family(); public function buy(); } class Person implements Skill { public function family() { echo '人族在伐木<br/>'; } public function buy() { echo '人族在使用人民币买东西<br/>'; } } class Jingling implements Skill { public function family() { echo '精灵族在伐木<br/>'; } public function buy() { echo '精灵族在使用精灵币买东西<br/>'; } } //工厂类,用来负责创建对象的 class Factory { public static function createHero($type) { switch($type) { case 'person': return new Person(); break; case 'jingling': return new Jingling(); break; } } } //测试 $object = Factory::createHero('person'); $object->buy();
上面的代码就是一个简单通俗的工厂模式了
3、工厂方法模式(更进一步的工厂模式)
工厂方法模式的核心是工程类不再负责所有对象的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,它仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
工厂方法模式示例代码:
<?php interface Tell { public function call(); public function receive(); } class XiaoMi implements Tell { public function call() { echo '使用小米手机打电话<br/>'; } public function receive() { echo '使用小米手机接电话<br/>'; } } class HuaWei implements Tell { public function call() { echo '使用华为手机打电话<br/>'; } public function receive() { echo '使用华为手机接电话<br/>'; } } //工厂类,只负责规定接口,不再负责创建对象。具体实现(创建对象等)操作交给子类 interface Factory { public static function createPhone(); } class XiaoMiFactory implements Factory { public static function createPhone() { return new XiaoMi(); } } //定义一个华为工厂类,来实现工厂类中的方法 class HuaWeiFactory implements Factory { public static function createPhone() { return new HuaWei(); } } //测试 $object = HuaWeiFactory::createPhone(); $object->call();
以上代码就是一个简单的工厂方法模式,工厂方法模式它是又将不同的产品线,又给你细化分开了,在思路上更清晰,在代码耦合度上更降低了。
声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。
精彩评论