讲解 简单工厂模式
简单工厂模式又称静态工厂方法模式,之所以可以这么说,是因为简单工厂模式是通过一个静态方法来创建对象的。
<?php
header('Content-Type:text/html;charset=utf-8');
/**
*简单工厂模式(静态工厂方法模式)
*/
/**
* Interface people 人类
*/
interface people
{
public function say();
}
/**
* Class man 继承people的男人类
*/
class man implements people
{
// 具体实现people的say方法
public function say()
{
echo '我是男人<br>';
}
}
/**
* Class women 继承people的女人类
*/
class women implements people
{
// 具体实现people的say方法
public function say()
{
echo '我是女人<br>';
}
}
/**
* Class SimpleFactoty 工厂类
*/
class SimpleFactoty
{
// 简单工厂里的静态方法-用于创建男人对象
static function createMan()
{
return new man();
}
// 简单工厂里的静态方法-用于创建女人对象
static function createWomen()
{
return new women();
}
}
/**
* 具体调用
*/
$man = SimpleFactoty::createMan();
$man->say();
$woman = SimpleFactoty::createWomen();
$woman->say();
运行结果:
我是男人
我是女人
工厂方法模式
定义一个用于创建对象的接口,让子类决定哪个类实例化。 他可以解决简单工厂模式中的封闭开放原则问题。
<?php
header('Content-type:text/html;charset=utf-8');
/*
*工厂方法模式
*/
/**
* Interface people 人类
*/
interface people
{
public function say();
}
/**
* Class man 继承people的男人类
*/
class man implements people
{
// 实现people的say方法
function say()
{
echo '我是男人-hi<br>';
}
}
/**
* Class women 继承people的女人类
*/
class women implements people
{
// 实现people的say方法
function say()
{
echo '我是女人-hi<br>';
}
}
/**
* Interface createPeople 创建人物类
* 注意:与上面简单工厂模式对比。这里本质区别在于,此处是将对象的创建抽象成一个接口。
*/
interface createPeople
{
public function create();
}
/**
* Class FactoryMan 继承createPeople的工厂类-用于实例化男人类
*/
class FactoryMan implements createPeople
{
// 创建男人对象(实例化男人类)
public function create()
{
return new man();
}
}
/**
* Class FactoryMan 继承createPeople的工厂类-用于实例化女人类
*/
class FactoryWomen implements createPeople
{
// 创建女人对象(实例化女人类)
function create()
{
return new women();
}
}
/**
* Class Client 操作具体类
*/
class Client
{
// 具体生产对象并执行对象方法测试
public function test() {
$factory = new FactoryMan();
$man = $factory->create();
$man->say();
$factory = new FactoryWomen();
$man = $factory->create();
$man->say();
}
}
// 执行
$demo = new Client;
$demo->test();
看结果:
我是男人-hi
我是女人-hi
抽象工厂模式
提供一个创建一系列相关或相互依赖对象的接口。
注意:这里和工厂方法的区别是:一系列(多个),而工厂方法只有一个。
<?php
header('Content-type:text/html;charset=utf-8');
/*
* 抽象工厂模式
*/
/**
* Interface people 人类
*/
interface people
{
public function say();
}
/**
* Class OneMan 第一个男人类-继承people
*/
class OneMan implements people
{
// 实现people的say方法
public function say()
{
echo '男1:我喜欢你<br>';
}
}
/**
* Class TwoMan 第二个男人类-继承people
*/
class TwoMan implements people{
// 实现people的say方法
public function say()
{
echo '男2:我看上你了<br>';
}
}
/**
* Class OneWomen 第一个女人类-继承people
*/
class OneWomen implements people {
// 实现people的say方法
public function say()
{
echo '女1:我不喜欢你<br>';
}
}
/**
* Class TwoWomen 第二个女人类-继承people
*/
class TwoWomen implements people {
// 实现people的say方法
public function say()
{
echo '女2:滚一边玩去<br>';
}
}
/**
* Interface createPeople 创建对象类
* 注意:这里将对象的创建抽象成了一个接口。
*/
interface createPeople
{
// 创建第一个
public function createOne();
// 创建第二个
public function createTwo();
}
/**
* Class FactoryMan 用于创建男人对象的工厂类-继承createPeople
*/
class FactoryMan implements createPeople
{
// 创建第一个男人
public function createOne()
{
return new OneMan();
}
// 创建第二个男人
public function createTwo()
{
return new TwoMan();
}
}
/**
* Class FactoryWomen 用于创建女人对象的工厂类-继承createPeople
*/
class FactoryWomen implements createPeople
{
// 创建第一个女人
public function createOne()
{
return new OneWomen();
}
// 创建第二个女人
public function createTwo()
{
return new TwoWomen();
}
}
/**
* Class Client 执行测试类
*/
class Client {
// 具体生成对象和执行方法
public function test() {
// 男人
$factory = new FactoryMan();
$man = $factory->createOne();
$man->say();