1. 概念
工厂模式是我们最常用的实例化对象模式,是用工厂方法代替new操作的一种模式。它的好处就是当你想要更改所实例化的类名时,只需更改该工厂方法内容即可,不需逐一寻找代码中具体实例化的地方(new处)修改了。为系统结构提供灵活的动态扩展机制,减少了耦合。
2. 工厂模式分类
2.1. 简单工厂模式
又被称为静态工厂方法模式,它属于类创建型模式,可以根据参数的不同返回不同的类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。其优点是:实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责;但缺点是:工厂类不够灵活,增加新的具体实例需要修改工厂类的判断逻辑代码,而且实例较多时,工厂方法代码将会非常复杂。
<?php
class Cat
{
function __construct()
{
echo "I am Cat class <br>";
}
}
class Dog
{
function __construct()
{
echo "I am Dog class <br>";
}
}
class Factory
{
public static function CreateAnimal($name){
if ($name == 'cat') {
return new Cat();
} elseif ($name == 'dog') {
return new Dog();
}
}
}
$cat = Factory::CreateAnimal('cat');
$dog = Factory::CreateAnimal('dog');
2.2. 工厂方法模式
在此模式中,通过定义一个抽象的核心工厂类,并定义创建产品对象的接口,创建具体产品实例的工作延迟到其工厂子类去完成。这样做的好处是核心类只关注工厂类的接口定义,而具体的产品实例交给具体的工厂子类去创建。当系统需要新增一个产品,无需修改现有系统代码,只需要添加一个具体产品类和其对应的工厂子类,使系统的扩展性变得很好,符合面向对象编程的开闭原则。
<?php
interface Animal{
public function run();
public function say();
}
class Cat implements Animal
{
public function run(){
echo "I ran slowly <br>";
}
public function say(){
echo "I am Cat class <br>";
}
}
class Dog implements Animal
{
public function run(){
echo "I'm running fast <br>";
}
public function say(){
echo "I am Dog class <br>";
}
}
abstract class Factory{
abstract static function createAnimal();
}
class CatFactory extends Factory
{
public static function createAnimal()
{
return new Cat();
}
}
class DogFactory extends Factory
{
public static function createAnimal()
{
return new Dog();
}
}
$cat = CatFactory::createAnimal();
$cat->say();
$cat->run();
$dog = DogFactory::createAnimal();
$dog->say();
$dog->run();
2.3. 抽象工厂模式
提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
<?php
interface TV{
public function open();
public function watch();
}
class HaierTv implements TV
{
public function open()
{
echo "Open Haier TV <br>";
}
public function watch()
{
echo "I'm watching Haier TV <br>";
}
}
class LenovoTv implements TV
{
public function open()
{
echo "Open Lenovo TV <br>";
}
public function watch()
{
echo "I'm watching Lenovo TV <br>";
}
}
interface PC{
public function work();
public function play();
}
class LenovoPc implements PC
{
public function work()
{
echo "I'm working on a Lenovo computer <br>";
}
public function play()
{
echo "Lenovo computers can be used to play games <br>";
}
}
class HaierPc implements PC
{
public function work()
{
echo "I'm working on a Haier computer <br>";
}
public function play()
{
echo "Haier computers can be used to play games <br>";
}
}
abstract class Factory{
abstract public static function createPc();
abstract public static function createTv();
}
class HaierFactory extends Factory
{
public static function createTv()
{
return new HaierTv();
}
public static function createPc()
{
return new HaierPc();
}
}
class LenovoFactory extends Factory
{
public static function createTv()
{
return new LenovoTv();
}
public static function createPc()
{
return new LenovoPc();
}
}
$haierFactory = new HaierFactory();
$haierTv = $haierFactory->createTv();
$haierTv->open();
$haierTv->watch();
$haierPc = $haierFactory->createPc();
$haierPc->work();
$haierPc->play();
$lenovoFactory = new LenovoFactory();
$lenovoPc = $lenovoFactory->createPc();
$lenovoPc->work();
$lenovoPc->play();
$lenovoTv = $lenovoFactory->createTv();
$lenovoTv->open();
$lenovoTv->watch();