目录

  • 工厂模式
    • 1、简单工厂模式
    • 2、工厂方法模式
    • 3、抽象工厂模式
  • 总结

提示:以下是本篇文章正文内容,下面案例可供参考

工厂模式

概念: 工厂模式:提供获取某个对象实例的一个接口,同时使调用代码避免确定实例化基类的步骤;实际上就是建立一个统一的类实例化的函数接口。统一调用,统一控制。

工厂模式属于创建型设计模式。

1、简单工厂模式

简单工厂模式又叫做静态工厂模式。
 
特点: 将调用者与创建者分离,调用者直接向工厂请求,减少代码的耦合,提高系统的可维护性与可扩展性。
缺点:当要修改类的时候,工厂类也需要做出相对应的更改,违反了开闭原则(对于扩展代码开放,对于类内修改关闭)。

// 加法类
class add
{public function getVal($i, $j){return $i + $j;}
}
// 乘法类
class mul
{public function getVal($i, $j){return $i * $j;}
}
// 文本
class text
{public function getVal(){return '文本';}
}
// 输出结果
class factory
{public static function outputResult($class) {$res = null;switch ($class) {case 'add':$res = new add;break;case 'mul':$res = new mul;break;case 'text':$res = new text;break;default:return null;}return $res;}
}
$factory1 = factory::outputResult('add');
echo $factory1->getVal(1, 4). '<br/>'; // 5
$factory1 = factory::outputResult('mul');
echo $factory1->getVal(1, 4). '<br/>'; // 4
$factory1 = factory::outputResult('text');
echo $factory1->getVal(). '<br/>'; // 文本

2、工厂方法模式

特点:

完全实现开闭原则,实现了对扩展开放,对更改关闭。
工厂类和产品类往往可以依次对应。
一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。

代码实现就是:一个工厂方法的功能由一个接口继承实现。

// 如果要添加新的计算方式直接添加新的计算类不必修改原来的代码,降低耦合度,可以测试下面注释的示例
interface base
{function getVal($i, $j);
}
// 加法
class add implements base
{function getVal($i, $j){return $i + $j;}
}
// 减法
class sub implements base
{function getVal($i, $j){return $i - $j;}
}
// // 乘法
// class mul implements base
// {//     function getVal($i, $j)
//     {//         return $i * $j;
//     }
// }
interface baseFactory
{function getResult();
}
// 加法工厂
class addFactory implements baseFactory
{function getResult(){return new add();}
}
// 减法工厂
class subFactory implements baseFactory
{function getResult(){return new sub();}
}
// // 乘法工厂
// class mulFactory implements baseFactory
// {//     function getResult()
//     {//         return new mul();
//     }
// }$i = 10;
$j = 5;
$addFactory = new addFactory();
$add = $addFactory->getResult();
echo '加: '. $add->getVal($i, $j)."<br/>";
$subFactory = new subFactory();
$sub = $subFactory->getResult();
echo '减: '. $sub->getVal($i, $j)."<br/>";
// $mulFactory = new mulFactory();
// $mul = $mulFactory->getResult();
// echo '乘: '. $mul->getVal($i, $j)."<br/>";

3、抽象工厂模式

抽象工厂是在工厂方法模式再进行一次复杂的处理。它是工厂方法的升级版。
这里和工厂方法的区别是:一系列,而工厂方法则是一个。

代码实现就是:一个抽象工厂的功能可以实现多个接口的功能。
如下:两个不同的接口实现了不同加减法,然后通过调用不同接口的同类方法(add和add2, sub和sub2)组成抽象工厂(加法工厂和减法工厂)

// 接口1
interface base
{function getVal($i, $j);
}
class add implements base
{function getVal($i, $j){return $i + $j;}
}
class sub implements base
{function getVal($i, $j){return $i - $j;}
}// 接口2
interface base2
{function getVal($i, $j);
}
class add2 implements base2
{function getVal($i, $j){return $i + $j + 2;}
}
class sub2 implements base2
{function getVal($i, $j){return $i - $j - 2;}
}interface baseFactory
{function getResult();function getResult2();
}
// 加法工厂
class addFactory implements baseFactory
{function getResult(){return new add();}function getResult2(){return new add2();}
}
// 减法工厂
class subFactory implements baseFactory
{function getResult(){return new sub();}function getResult2(){return new sub2();}
}
$i = 10;
$j = 5;
$addFactory = new addFactory();
$add = $addFactory->getResult();
echo '加: '. $add->getVal($i, $j)."<br/>";
$subFactory = new subFactory();
$sub = $subFactory->getResult();
echo '减: '. $sub->getVal($i, $j)."<br/>";$addFactory1 = new addFactory();
$add1 = $addFactory1->getResult2();
echo '加1: '. $add1->getVal($i, $j)."<br/>";
$subFactory1 = new subFactory();
$sub1 = $subFactory1->getResult2();
echo '减1: '. $sub1->getVal($i, $j)."<br/>";

总结

工厂方法模式:

  • 一个抽象产品类,可以派生出多个具体产品类。
  • 一个抽象工厂类,可以派生出多个具体工厂类。
  • 每个具体工厂类只能创建一个具体产品类的实例。

抽象工厂模式:

  • 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
  • 一个抽象工厂类,可以派生出多个具体工厂类。
  • 每个具体工厂类可以创建多个具体产品类的实例。

三种工厂的比较

  • 简单工厂 :用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力[修改原方法])
  • 工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)
  • 抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力[修改原方法];支持增加产品族)

PHP 设计模式 - 工厂模式相关推荐

  1. Java设计模式-工厂模式(3)抽象工厂模式

    在Java设计模式-工厂模式(2)工厂方法模式 我们知道了工厂方法模式解决了简单工厂模式中的缺陷,做到了满足开闭原则,但是时代是进步的,进而又产生新的问题,工厂难道只能生产一种东西吗.我们所见到的工厂 ...

  2. Java设计模式-工厂模式(2)工厂方法模式

    在Java设计模式-工厂模式(1)简单工厂模式 中我们介绍了简单工厂模式,提到了简单工厂模式违背了开闭原则,而"工厂方法模式"是对简单工厂模式的进一步抽象化,其好处是可以使系统在不 ...

  3. Java设计模式-工厂模式(1)简单工厂模式

    Java设计模式-工厂模式(1)简单工厂模式 一.前言 1)例子 2)类图关系 3)代码实现 二.简单工厂模式 2.1.概述: 2.2.类图关系: 2.3.代码修改: 2.4.优缺点 2.5.扩展-简 ...

  4. 设计模式---工厂模式

    设计模式---工厂模式 工厂方法模式 概述:工厂方法模式中抽象工厂负责定义创建对象的接口,具体创建工作由继承抽象工厂的具体类实现. 优点:客户端不需要再负责对象的创建,从而明确了各个类的职责,如果有新 ...

  5. java设计模式工厂模式_Java中的工厂设计模式

    java设计模式工厂模式 Welcome to the Factory Design Pattern in Java tutorial. Factory Pattern is one of the C ...

  6. java设计模式工厂模式_Java中的复合设计模式

    java设计模式工厂模式 Composite pattern is one of the Structural design pattern. Composite design pattern is ...

  7. java设计模式工厂模式_Java中的桥梁设计模式

    java设计模式工厂模式 Today we will look into Bridge Design Pattern in java. When we have interface hierarchi ...

  8. java设计模式工厂模式_Java中的外观设计模式

    java设计模式工厂模式 Facade Design Pattern is one of the Structural design patterns (such as Adapter pattern ...

  9. 设计模式-工厂模式(学习)

    设计模式-工厂模式(学习) 在程序的世界里,就像射雕英雄传一样,我们的技能就像是武功一样,我们只有不断去学习练习才能有机会像郭靖一样成为"天下第一". 我认为技能和武功是很类似的, ...

  10. 设计模式-工厂模式的3中不同实现[JAVA]

    设计模式-工厂模式的3中不同实现[JAVA] 工厂模式简介 In Factory pattern, we create object without exposing the creation log ...

最新文章

  1. CentOS升级gcc到4.8.2以支持C++11标准的方法
  2. mysql字段timestamp为空映射报错处理
  3. 使用postman测试oauth2.0认证服务中出现OAuth出现Bad credentials
  4. JS Compress and Decompress
  5. 【Golang 源码】sync.Map 源码详解
  6. 《恋上数据结构第1季》二叉搜索树BST
  7. Python的__init__和self是做什么的?
  8. PAT-乙级-1035 插入与归并
  9. CodeForces Round #295 Div.2
  10. Easyx-----c语言实现烟花表白程序
  11. Python实现词云图的3种方式(词频,一段文本,自定义样式)
  12. sql中interval用法总结
  13. 数据结构上机实验之串子系统
  14. ETHZ 计算机视觉实验室招聘医学图像分析方向博士后研究员
  15. 哈夫曼树的创建和哈夫曼树编码及解码
  16. hdu 3183 贪心
  17. 菜鸟学习JSP之第6章-servlet
  18. 核芯国产高压运放CLA4031/ CLA4032
  19. 蜂鸟E203学习笔记(二)--蜂鸟E203总体框架
  20. 怎么看java架包里的源码,vlx文件可以查看源代码|怎么查看Jar包源码?如何打开Jar文件?...

热门文章

  1. 震惊!用Python探索《红楼梦》的人物关系!
  2. ORA-01221: data file 5 is not the same file to a background process
  3. 需求说明定义一个超市会员类属性名字会员号余额积分打印名字 会员号 余额和积分充值的方法余额 要累加 输出一下余额消费的方法余额减 积分累加 每消费10元
  4. 如何打开PPT上个保存的版本
  5. MP可提供全面的裂解介质,满足不同应用的需求
  6. 魅族搭载鸿蒙的机型,魅族宣布接入鸿蒙,但你可能要失望了....
  7. 企业网络规划方案设计
  8. 嵌入式 - 晶振频率的来源和UART波特率的选择
  9. 【智能路由器】openwrt工具uci使用指南
  10. 一些微软编程工具或SDK的官方下载地址