php的设计模式------工厂模式
1.工厂模式简介
属于创建型模式。定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行
主要解决的问题:接口选择的问题。
2.分类
2.1 简单工厂模式
接口:interface
具体:class
工厂:factory
// 1 创建一个接口
interface Shape{
const NAME = 'vic';
public function draw(); } // 2.实体类
class Rectangle implements Shape{
public function draw(){
echo 'Rectangle';
}
} class Square implements Shape{
public function draw(){
echo 'Square';
}
} class Circle implements Shape{
public function draw(){
echo 'Circle';
}
}
// 新的图形,可以在此创建类,扩展 // 3.创建工厂
class ShapeFactory {
public static function getShape( string $shapeType){
if( empty($shapeType) ){
return ;
}
switch( strtolower($shapeType) ){
case 'rectangle':
return new Rectangle();
break;
case 'Square':
return new Square();
break;
case 'circle':
return new Circle();
break;
//如果有其他图形,可以扩展
} return ;
}
} $shape = shapeFactory::getShape('Rectangle'); $shape->draw();
2.2抽象工厂模式
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
接口:interface
实体:class 抽象工厂:interface Factory
工厂实体:class Factory 创建工厂: factory
// 1 创建一个接口
interface Shape{
const NAME = 'vic';
public function draw(); } // 1.2 颜色接口
interface Color{
function fill();
}
// 2.实体类
class Rectangle implements Shape{
public function draw(){
echo 'Rectangle';
}
} class Square implements Shape{
public function draw(){
echo 'Square';
}
} class Circle implements Shape{
public function draw(){
echo 'Circle';
}
} // 2.2 颜色实体类
class Red implements Color{
public function fill(){
echo 'Red';
}
}
class Green implements Color{
public function fill(){
echo 'Green';
}
}
class Blue implements Color{
public function fill(){
echo 'Blue';
}
}
// 3 抽象工厂类
interface Factory{
function getShape( string $shapeType );
function getColor( string $color );
}
// 4.工厂实体类
class ShapeFactory implements Factory{
public function getShape( string $shapeType){
if( empty($shapeType) ){
return ;
}
switch( strtolower($shapeType) ){
case 'rectangle':
return new Rectangle();
break;
case 'Square':
return new Square();
break;
case 'circle':
return new Circle();
break;
//如果有其他图形,可以扩展
} return ;
}
public function getColor( string $color ){
//这里违背了接口隔离原则,此方法在此类中无用,却被迫实现
return ;
}
}
class ColorFactory implements Factory{
public function getShape( string $shapeType ){ return ;
}
public function getColor( string $color ){
if( empty($color )){
return ;
}
switch ( strtolower($color) ) {
case 'red':
return new Red();
break;
case 'green':
return new Green();
break;
case 'blue':
return new Blue();
break;
}
return ;
}
}
// 5 实现工厂
class FactoryProduct{
public static function getFactory( $choice ){ if( empty(strcasecmp($choice,'shape')) ){
return new ShapeFactory();
} else if ( empty(strcasecmp($choice, 'color')) ){
return new ColorFactory();
}
return ;
}
} try{
$factory = FactoryProduct::getFactory('shape');
$shape = $factory->getShape('circle'); $shape->draw();
// } catch( Exception $e){ // php5 捕获异常,不可以捕获错误
// echo $e->getMessage();
// }
} catch( Error $e){ // php7 可以捕获错误
var_dump($e->getMessage());
}
// 捕获错误异常的方法 php5
function shutdown_function(){ $e = error_get_last(); // var_dump($e);
}
register_shutdown_function('shutdown_function');
php的设计模式------工厂模式的更多相关文章
- .NET设计模式: 工厂模式
.NET设计模式: 工厂模式(转) 转自:http://www.cnblogs.com/bit-sand/archive/2008/01/25/1053207.html .NET设计模式(1): ...
- 【设计模式】Java设计模式 -工厂模式
[设计模式]Java设计模式 -工厂模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目 ...
- [Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- javascript 设计模式-----工厂模式
所谓的工厂模式,顾名思义就是成批量地生产模式.它的核心作用也是和现实中的工厂一样利用重复的代码最大化地产生效益.在javascript中,它常常用来生产许许多多相同的实例对象,在代码上做到最大的利用. ...
- JavaScript设计模式——工厂模式
工厂模式:是一种实现“工厂”概念的面上对象设计模式.实质是定义一个创建对象的接口,但是让实现这个接口的类来决定实例化哪个类.工厂方法让类的实例化推迟到子类中进行.创建一个对象常常需要复杂的过程,所以不 ...
- 10.Java设计模式 工厂模式,单例模式
Java 之工厂方法和抽象工厂模式 1. 概念 工厂方法:一抽象产品类派生出多个具体产品类:一抽象工厂类派生出多个具体工厂类:每个具体工厂类只能创建一个具体产品类的实例. 即定义一个创建对象的接口(即 ...
- 学习:java设计模式—工厂模式
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Facto ...
- 设计模式——工厂模式 (C++实现)
软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累. ...
- Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)
工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...
- 设计模式——工厂模式(Factory)
要想正确理解设计模式,首先必须明白它是为了解决什么问题而提出来的. 设计模式学习笔记 --Shulin 转载请注明出处:http://blog.csdn.net/zhshulin 1.概念 工厂模式定 ...
随机推荐
- 存储引擎(Mysql)
最常使用的2种存储引擎:1.Myisam是Mysql的默认存储引擎,当create创建新表时,未指定新表的存储引擎时,默认使用Myisam.每个MyISAM在磁盘上存储成三个文件.文件名都和表名相同, ...
- NOIP2016Day2T3愤怒的小鸟(状压dp) O(2^n*n^2)再优化
看这范围都知道是状压吧... 题目大意就不说了嘿嘿嘿 网上流传的写法复杂度大都是O(2^n*n^2),这个复杂度虽然官方数据可以过,但是在洛谷上会TLE[百度搜出来前几个博客的代码交上去都TLE了], ...
- 【并查集】【P1525】关押罪犯
传送门 Description Input Output Sample Input Sample Output Hint Solution 非常显然的并查集题目,在本题中,对于每个罪犯i,维护两个信息 ...
- Django Model 数据表
Django Model 定义语法 版本:1.7主要来源:https://docs.djangoproject.com/en/1.7/topics/db/models/ 简单用法 from djang ...
- ACE中UDP通信
转载于:http://www.cnblogs.com/TianFang/archive/2006/12/07/585205.html udp是一种无连接的协议,提供无连接不可靠的服务. 在ace中,通 ...
- AtCoder Grand Contest 031 B - Reversi(DP)
B - Reversi 题目链接:https://atcoder.jp/contests/agc031/tasks/agc031_b 题意: 给出n个数,然后现在你可以对一段区间修改成相同的值,前提是 ...
- 重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性.重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同.参数个数不同或者二者都不同)则视 ...
- 【题解】Huge Mods UVa 10692 欧拉定理
题意:计算a1^( a2^( a3^( a4^( a5^(...) ) ) ) ) % m的值,输入a数组和m,不保证m是质数,不保证互质 裸的欧拉定理题目,考的就一个公式 a^b = a^( b % ...
- js ejs for语句的第二种遍历用法
var A = {a:1,b:2,c:3,d:"hello world"}; for(var k in A) { console.log(k,A[k]); var h = new ...
- Fragment+ViewPager实现仿微信点击和滑动切换界面
这是在我写的新闻App中实现的界面切换 贴出切换界面的主要代码: xml代码: <span style="font-size:14px;"> <android.s ...