1. 工厂模式分类
工厂模式具体可分为三类模式:简单工厂模式,工厂方法模式,抽象工厂模式;
2. 简单工厂模式
又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
优点: 实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责
缺点: 工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码将会非常复杂
2.1. 角色
- Factory类:负责创建具体产品的实例
- Product类:抽象产品类,定义产品子类的公共接口
- ConcreteProduct 类:具体产品类,实现Product父类的接口功能,也可添加自定义的功能
2.2. UML类图
php示例代码: Factory.class.php
<?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');
3. 工厂方法模式
此模式中,通过定义一个抽象的核心工厂类,并定义创建产品对象的接口,创建具体产品实例的工作延迟到其工厂子类去完成。这样做的好处是核心类只关注工厂类的接口定义,而具体的产品实例交给具体的工厂子类去创建。当系统需要新增一个产品,无需修改现有系统代码,只需要添加一个具体产品类和其对应的工厂子类,使系统的扩展性变得很好,符合面向对象编程的开闭原则;
3.1. 角色
- Product:抽象产品类
- ConcreteProduct:具体产品类
- Factory:抽象工厂类
- ConcreteFactory:具体工厂类
3.2. UML类图
php示例代码 ConcreteFactory.class.php:
<?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();
4. 抽象工厂模式
提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
此模式是对工厂方法模式的进一步扩展。在工厂方法模式中,一个具体的工厂负责生产一类具体的产品,即一对一的关系,但是,如果需要一个具体的工厂生产多种产品对象,那么就需要用到抽象工厂模式了。
4.1. 角色
- 抽象工厂(AbstractFactory):担任这个角色的是抽象工厂模式的核心,是与应用系统的商业逻辑无关的。
- 具体工厂(Factory):这个角色直接在客户端的调用下创建产品的实例,这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统商业逻辑紧密相关的。
- 抽象产品(AbstractProduct):担任这个角色的类是抽象工厂模式所创建的对象的父类,或它们共同拥有的接口
- 具体产品(Product):抽象工厂模式所创建的任何产品对象都是一个具体的产品类的实例。
4.2. 抽象工厂模式UML类图
php示例代码: AbstructFactory.class.php
<?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();
php关键字
abstract(抽象) :
- 用abstract修饰的类表示这个类是一个抽象类,用abstract修饰的方法表示这个方法是一个抽象方法。
- 抽象方法是只有方法声明,而没有方法的实现内容。
- 抽象类不能被实例化,通常是将抽象方法做为子类方法重写使用的,且要把继承的抽象类里的方法都实现。
interface (接口):
- 如果一个抽象类里的所有方法都是抽象方法,且没有声明变量,所有成员都是public权限,那么这种特殊的抽象类就叫 接口
- interface即PHP接口,并用关键字implements来实现接口中方法,且必须完全实现
implements(实施,实现) :
implements是实现多个接口,接口的方法一般为空,必须重写才能使用
extends(继承) :
extends是继承某个类,继承之后可以使用父类的方法,也可以重写父类的方法,如果类被声明为final,则不能被继承