工厂模式
创建一个类统一实例化的方法。统一调用,控制。常与单例模式相配合。
简单工厂模式
Demo:
/**
*简单工厂又叫静态工厂方法模式,这样理解可以确定,简单工厂模式是通过一个静态方法创建对象的。
// 简单工厂模式
interface ICar {
function run();
}
class BMWCar implements ICar {
public function run() {
echo 'bmw run!<br/>';
}
}
class AuDiCar implements ICar {
public function run() {
echo 'audi run!<br/>';
}
}
/**
* 简单工厂
*/
class FactorySimple {
/*
public static function createBmw() {
return new BMWCar();
}
public static function createAudi() {
return new AuDiCar();
}
*/
public static function createCar($type) {
switch($type) {
case 'bmw':
return new BMWCar();
case 'audi':
return new AuDiCar();
default:
throw new Exception('type error!');
}
}
}
优点:客户端不需要修改代码。
缺点: 当需要增加新的运算类的时候,不仅需新加运算类,还要修改工厂类,违反了开闭原则。
工厂方法模式
和简单工厂有区别,简单工厂模式只有一个工厂,工厂方法模式对每一个产品都有相应的工厂
Demo:
/*
*工厂方法模式:
*定义一个创建对象的接口,让子类决定哪个类实例化。 他可以解决简单工厂模式中的封闭开放原则问题。 */
interface ICar {
function run();
}
class BMWCar implements ICar {
public function run() {
echo 'bmw run!<br/>';
}
}
class AuDiCar implements ICar {
public function run() {
echo 'audi run!<br/>';
}
}
// 工厂方法模式 与简单工厂的区别,将对象的创建抽象成接口
interface CreateCar { //工厂类接口
function create();
}
/**
* bmw car factoyr
*/
class BmwFactory implements CreateCar {
public function create() {
return new BMWCar();
}
}
/**
* audi car factory
*/
class AuDiFactory implements CreateCar {
public function create() {
return new AuDiCar();
}
}
抽象工厂模式:
用来生成一组相关或相互依赖的对象。
工厂方法模式针对的是一个产品等级结构;
而抽象工厂模式则是针对的多个产品等级结构
Demo:
/*
抽象工厂:提供一个创建一系列相关或相互依赖对象的接口。
注意:这里和工厂方法的区别是:一系列,而工厂方法则是一个。
那么,我们是否就可以想到在接口create里再增加创建“一系列”对象的方法呢?
*/
interface ICar {
function run();
}
// 抽象工厂模式
class WhiteBMWCar implements ICar {
public function run() {
echo 'white bmwcar run!<br/>';
}
}
class BlackBMWCar implements ICar {
public function run() {
echo 'black bmwcar run!<br/>';
}
}
class WhiteAuDiCar implements ICar {
public function run() {
echo 'white audicar run!<br/>';
}
}
class BlackAuDiCar implements ICar {
public function run() {
echo 'black audicar run!<br/>';
}
}
// 与工厂方法的区别,提供一系列的接口
interface ICarCreate {
function createBmw();
function createAuDi();
}
/**
* create white car
*/
class WhiteCarFactory implements ICarCreate {
// white bmw
public function createBmw() {
return new WhiteBMWCar();
}
// white audi
public function createAuDi() {
return new WhiteAuDiCar();
}
}
/**
* create black car
*/
class BlackCarFactory implements ICarCreate {
// black bmw
public function createBmw() {
return new BlackBMWCar();
}
// black audi
public function createAuDi() {
return new BlackAuDiCar();
}
}