<?php
/**1
* 设计模式之简单工厂模式
* 小黄牛
*/
header("Content-type: text/html; charset=utf-8");
/**
* 接口 - 技能设定
*/
interface IProduct{
public function Attack(); // 攻击
public function Defense(); // 防御
}
/**
* 创建 - 步兵
*/
class XPinfantry implements IProduct{
public function Attack() { echo '步兵进攻,攻击力:10~ <br/>';}
public function Defense(){ echo '步兵防守,防御力:20~ <br/>';}
}
/**
* 创建 - 骑兵
*/
class XPcavalry implements IProduct{
public function Attack() { echo '骑兵进攻,攻击力:30~ <br/>';}
public function Defense(){ echo '骑兵防守,防御力:5~ <br/>';}
}
/**
* 工厂角色
*/
class ProductFactory{
public static function GetInstance($style){
switch ($style){
case 1: // 创建步兵
return new XPinfantry();
break;
case 2: // 创建骑兵
return new XPcavalry();
break;
default:
return null;
}
}
}
$obj = array();
$obj[] = ProductFactory::GetInstance(1); // 生产一个步兵
$obj[] = ProductFactory::GetInstance(2); // 生产一个骑兵
$obj[] = ProductFactory::GetInstance(3); // 生产错了
$obj[] = ProductFactory::GetInstance(2); // 生产一个骑兵
foreach ($obj as $val) {
if ($val) {
$val->Attack(); // 进攻
$val->Defense(); // 防守
} else {
echo '暂无该类兵种!<br/>';
}
}
浏览器输出1
步兵进攻,攻击力:10~
步兵防守,防御力:20~
骑兵进攻,攻击力:30~
骑兵防守,防御力:5~
暂无该类兵种!
骑兵进攻,攻击力:30~
骑兵防守,防御力:5~
简单工厂模式
工厂(SimpleFactory)角色:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
抽象产品(IProduct)角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色:是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
需求:根据提供相应的属性值由简单工厂创建具有相应特性的产品对象。
优点
让对象的调用者和对象创建过程分离,当对象调用者需要对象时,直接向工厂请求即可。从而避免了对象的调用者与对象的实现类以硬编码方式耦合,以提高系统的可维护性、可扩展性。
缺点
当产品修改时,工厂类也要做相应的修改,比如要增加一种操作方法,如冲锋技能,就得修改原有类,违背了开放-封闭原则