工厂模式提供获取某个对象实例的一个接口,同时使调用代码避免确定实例化基类的步骤;实际上就是建立一个统一的类实例化的函数接口。统一调用,统一控制。
应用场景:提供一种类,具有为您创建对象的某些方法,这样就可以使用工厂类创建对象,而不直接使用new。这样如果想更改创建的对象类型,只需更改该工厂即可。
工厂模式分三种:简单工厂模式,工厂方法模式,抽象工厂模式。
简单工厂模式
特点:将调用象和创建对象分离,使用时直接向工厂请求,减少代码的耦合.提高系统的可维护性与可扩展性。
<?php
class A
{
function __construct()
{
echo "我是A类";
}
}
class B
{
function __construct()
{
echo "我是B类";
}
}
class Factory
{
public static function create($name)
{
if ($name == 'A') {
return new A();
} elseif ($name == 'B') {
return new B();
}
}
}
$a = Factory::create('A');
$b = Factory::create('B');
工厂方法模式
特点:核心类仅仅负责给出具体工厂必须实现的接口,而无需再负责具体的产品类实例化,使得系统可以在不修改整体代码的情况下方便的引进新的产品。
<?php
interface Basic
{
public function actionOne();
public function actionTwo();
}
class A implements Basic
{
public function actionOne()
{
echo "我是A类—方法1";
}
public function actionTwo()
{
echo "我是A类—方法2";
}
}
class B implements Basic
{
public function actionOne()
{
echo "我是B类—方法1";
}
public function actionTwo()
{
echo "我是B类—方法2";
}
}
abstract class Factory
{
abstract static function createBasic();
}
class A_Factory extends Factory
{
public static function createBasic()
{
return new A();
}
}
class B_Factory extends Factory
{
public static function createBasic()
{
return new B();
}
}
$a = A_Factory::createBasic();
$a->actionOne();
$a->actionTwo();
$b = B_Factory::createBasic();
$b->actionOne();
$b->actionTwo();
抽象工厂模式
特点:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
<?php
interface Phone
{
public function open();
public function operate();
}
class HuaweiPhone implements Phone
{
public function open()
{
echo "打开华为手机";
}
public function operate()
{
echo "操作华为手机";
}
}
interface Bracelet
{
public function look();
public function click();
}
class XiaomiBracelet implements Bracelet
{
public function look()
{
echo "查看小米手环";
}
public function click()
{
echo "点击小米手环";
}
}
abstract class Factory
{
abstract public static function createPhone();
abstract public static function createBracelet();
}
class ProductFactory extends Factory{
public static function createPhone()
{
return new HuaweiPhone();
}
public static function createBracelet()
{
return new XiaomiBracelet();
}
}
$newPhone = ProductFactory::createPhone();
$newPhone->open();
$newPhone->operate();
$newBracelet = ProductFactory::createBracelet();
$newBracelet->look();
$newBracelet->click();
文章评论