2020-06-05_5eda16d590209.jpeg
工厂模式
工厂模式三大类 |
1、简单工厂模式(静态工厂方法模式) |
2、工厂方法模式 |
3、抽象工厂模式(Kit模式) |
简单工厂模式
shiyanlou:又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
角色 |
说明 |
Factory |
抽象工厂类,负责创建具体产品的实例 |
Product |
抽象产品类,定义产品子类的公共接口 |
ConcreteProduct |
具体产品类,实现 Product 父类的接口功能,也可添加自定义的功能 |
类名 |
担任角色 |
说明 |
Poultry |
Product |
抽象家禽类,定义家禽子类的公共接口 |
Cat |
ConcreteProduct |
猫类,实现家禽类的接口功能,也可添加自定义的功能 |
Dog |
ConcreteProduct |
狗类,实现家禽类的接口功能,也可添加自定义的功能 |
Duck |
ConcreteProduct |
鸭类,实现家禽类的接口功能,也可添加自定义的功能 |
Pasture |
Factory |
牧场类,负责饲养具体家禽的实例 |
简单工厂模式.png
<?php
interface Poultry
{
public function breed();
}
class Cat implements Poultry
{
public function breed()
{
echo "I am cat, I can breed.".PHP_EOL;
}
}
class Dog implements Poultry
{
public function breed()
{
echo "I am dog, I can breed.".PHP_EOL;
}
}
class Duck implements Poultry
{
public function breed()
{
echo "I am duck, I can breed.".PHP_EOL;
}
}
class Pasture
{
public static function feedPoultry($name){
switch ($name) {
case 'cat':
return (new Cat)->breed();
break;
case 'dog':
return (new Dog)->breed();
break;
case 'duck':
return (new Duck)->breed();
break;
}
}
}
$cat = Pasture::feedPoultry('cat');
$dog = Pasture::feedPoultry('dog');
$duck = Pasture::feedPoultry('duck');
$ php Pasture.php
I am cat, I can breed.
I am dog, I can breed.
I am duck, I can breed.
工厂方法模式
shiyanlou:此模式中,通过定义一个抽象的核心工厂类,并定义创建产品对象的接口,创建具体产品实例的工作延迟到其工厂子类去完成。这样做的好处是核心类只关注工厂类的接口定义,而具体的产品实例交给具体的工厂子类去创建。当系统需要新增一个产品,无需修改现有系统代码,只需要添加一个具体产品类和其对应的工厂子类,使系统的扩展性变得很好,符合面向对象编程的开闭原则;
角色 |
说明 |
Product |
抽象产品类,定义产品子类的公共接口 |
ConcreteProduct |
具体产品类,实现 Product 父类的接口功能,也可添加自定义的功能 |
Factory |
抽象工厂类,负责创建具体产品的实例 |
ConcreteFactory |
具体工厂类,实现 Factory 父类的接口功能,也可添加自定义的功能 |
类名 |
担任角色 |
说明 |
Livestock |
Product |
抽象家畜类,定义家畜子类的公共接口 |
Sheep |
ConcreteProduct |
羊类,实现家畜类的接口功能,也可添加自定义的功能 |
Cow |
ConcreteProduct |
牛类,实现家畜类的接口功能,也可添加自定义的功能 |
Pasture |
Factory |
抽象牧场类,定义牧场子类的公共接口 |
SheepPasture |
ConcreteFactory |
羊牧场类,实现牧场类的接口功能,也可添加自定义的功能 |
CowPasture |
ConcreteFactory |
牛牧场类,实现牧场类的接口功能,也可添加自定义的功能 |
工厂方法模式.png
<?php
interface Livestock{
public function breed();
}
class Sheep implements Livestock
{
public function breed(){
echo "I am sheep, I can breed.".PHP_EOL;
}
}
class Cow implements Livestock
{
public function breed(){
echo "I am cow, I can breed.".PHP_EOL;
}
}
interface Pasture
{
public function feedLivestock();
}
class SheepPasture implements Pasture
{
public function feedLivestock()
{
return new Sheep();
}
}
class CowPasture implements Pasture
{
public function feedLivestock()
{
return new Cow();
}
}
$sheep = SheepPasture::feedLivestock();
$sheep->breed();
$cow = CowPasture::feedLivestock();
$cow->breed();
$ php Pasture.php
I am sheep, I can breed.
I am cow, I can breed.
抽象工厂模式
baike:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。此模式是对工厂方法模式的进一步扩展。在工厂方法模式中,一个具体的工厂负责生产一类具体的产品,即一对一的关系,但是,如果需要一个具体的工厂生产多种产品对象,那么就需要用到抽象工厂模式了。
| 角色 | 说明 |
| ------------ | ------------ | ------------ |
|Factory|抽象工厂类,负责创建具体产品的实例|
|ConcreteFactory|具体工厂类,实现 Factory 父类的接口功能,也可添加自定义的功能|
|Product|抽象产品类,定义产品子类的公共接口|
|ConcreteProduct|具体产品类,实现 Product 父类的接口功能,也可添加自定义的功能|
类名 |
担任角色 |
说明 |
Pastoral |
Factory |
抽象牧区类,定义牧区子类的公共接口 |
XinJiangPastoral |
ConcreteFactory |
新疆牧区类,实现牧区类的接口功能,也可添加自定义的功能 |
QingHaIPastoral |
ConcreteFactory |
青海牧区类,实现牧区类的接口功能,也可添加自定义的功能 |
Sheep |
Product |
抽象羊类,定义羊子类的公共接口 |
Lambskin |
ConcreteProduct |
羔皮羊类,实现羊类的接口功能,也可添加自定义的功能 |
TibetanSheep |
ConcreteProduct |
藏羊类,实现羊类的接口功能,也可添加自定义的功能 |
Cow |
Product |
抽象牛类,定义牛子类的公共接口 |
Yak |
ConcreteProduct |
耗牛类,实现牛类的接口功能,也可添加自定义的功能 |
Cattle |
ConcreteProduct |
黄牛类,实现牛类的接口功能,也可添加自定义的功能 |
抽象工厂模式.png
<?php
interface Sheep{
public function run();
}
class Lambskin implements Sheep
{
public function run()
{
echo "I am lambskin, I can run.".PHP_EOL;
}
}
class TibetanSheep implements Sheep
{
public function run()
{
echo "I am tibetanSheep, I can run.".PHP_EOL;
}
}
interface Cow{
public function jump();
}
class Yak implements Cow
{
public function jump()
{
echo "I am yak, I can jump.".PHP_EOL;
}
}
class Cattle implements Cow
{
public function jump()
{
echo "I am cattle, I can jump.".PHP_EOL;
}
}
interface Pastoral{
public function feedSheep();
public function feedCow();
}
class XinJiangPastoral implements Pastoral
{
public function feedSheep()
{
return new Lambskin();
}
public function feedCow()
{
return new Yak();
}
}
class QingHaIPastoral implements Pastoral
{
public function feedSheep()
{
return new TibetanSheep();
}
public function feedCow()
{
return new Cattle();
}
}
$xinJiangPastoral = new XinJiangPastoral();
$lambskin = $xinJiangPastoral->feedSheep();
$lambskin->run();
$yak = $xinJiangPastoral->feedCow();
$yak->jump();
$qingHaIPastoral = new QingHaIPastoral();
$tibetanSheep = $qingHaIPastoral->feedSheep();
$tibetanSheep->run();
$cattle = $xinJiangPastoral->feedCow();
$cattle->jump();
$ php Pastoral.php
I am lambskin, I can run.
I am yak, I can jump.
I am tibetanSheep, I can run.
I am yak, I can jump.
网友评论