设计模式 工厂模式

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 牧场类,负责饲养具体家禽的实例
  • UML 类图
简单工厂模式.png
  • 创建 Pasture.php,内容如下:
<?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 牛牧场类,实现牧场类的接口功能,也可添加自定义的功能
  • UML 类图
工厂方法模式.png
  • 创建 Livestock.php,内容如下:
<?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 黄牛类,实现牛类的接口功能,也可添加自定义的功能
  • UML 类图
抽象工厂模式.png
  • 创建 Pastoral.php,内容如下:
<?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.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,504评论 4 365
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,898评论 1 300
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,218评论 0 248
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,322评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,693评论 3 290
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,812评论 1 223
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,010评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,747评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,476评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,700评论 2 251
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,190评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,541评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,206评论 3 240
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,129评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,903评论 0 199
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,894评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,748评论 2 274