PHP面向对象-设计模式 单例模式 简单工厂模式 工厂方法模式
1.单例模式
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。
要实现每一个类只有一个实例,就需要对实例化进行限制。
单例模式实现要点:
① 构造函数私有化,不允许使用new关键字创建对象
② 对外提供获取对象的方法。在方法中判断对象是否为空,如果为空则创建对象并返回,如果不为空则直接返回
③ 实例对象的属性以及获取对象的方法必须是静态的
④ 之后,创建对象只能使用我们提供的静态方法。
PHP实现单例模式代码如下:
class Singleton{
static private $Single = null;
//构造函数私有化,不准使用new关键字创建对象
private function __construct(){}
static function getSingle(){
if(!self::$Single){
// self::$Single = new Singleton();//new self();
self::$Single = new self();//和上面的语句等价
//上述语句完成了在类中通过静态方法创建对象并返回。
//self代指类名 new Singleton() 和new self()完全一样;
}
return self::$Single;
}
}
最后将其实例化,并且只能使用类中提供的方法。
$singletonInstance = Singleton::getSingle();
上述代码中,使用私有的静态变量和静态方法,通过类的静态方法创建实例,并且进行判断,如果第一次进行实例化,则成功,否则实例化失败。如此一来,每个类只有一个实例,因而实现了单例模式。
2.简单工厂模式
工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。这样可以让程序耦合度降低,实现解耦。
简单工厂模式PHP代码如下:
interface Product{
function productFunc();
}
class Product1 implements Product{
function productFunc(){
echo "this is ProductA function";
}
}
class Product2 implements Product{
function productFunc(){
echo "this is ProductB function";
}
}
class Factory{
static function createPro($pro){
switch ($pro) {
case 'ProductA':
return new ProductA();
break;
case 'ProductB':
return new ProductB();
break;
default:
break;
}
}
}
$proInstance1 = Factory::createPro("ProductA");
$proInstance2 = Factory::createPro("ProductB");
$proInstance1->productFunc();
$proInstance2->productFunc();
3.工厂方法模式
在原有的简单工厂模式的基础上,我们将工厂类也抽象出来,让工厂的子类去完成具体的工作。
工厂方法模式的PHP代码如下:
interface Product{
function productFunc();
}
class Product1 implements Product{
function productFunc(){
echo "this is ProductA function";
}
}
class Product2 implements Product{
function productFunc(){
echo "this is ProductB function";
}
}
//将工厂抽象出来,生产不同产品的具体功能交给他的子类完成
interface Factory{
function create();
}
//子类工厂A生产产品1
class FactoryA implements Factory(){
static function create(){
echo "this factory create ProductA";
return new Product1();
}
}
//子类工厂B生产产品2
class FactoryB implements Factory(){
static function create(){
echo "this factory create ProductB";
return new Product2();
}
}
$pro1 = FactoryA::create();
$pro2 = FactoryB::create();
$pro1->productFunc();
$pro2->productFunc();
以上为单里模式,简单工厂模式,工厂方法模式,的简单,后期还会在此更新其他的设计模式。(未完待续)
PHP面向对象-设计模式 单例模式 简单工厂模式 工厂方法模式的更多相关文章
- 【java设计模式】(10)---模版方法模式(案例解析)
一.概念 1.概念 模板方法模式是一种基于继承的代码复用技术,它是一种类行为型模式. 它定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的 ...
- 面向对象设计模式纵横谈:Factory Method 工厂方法模式(笔记记录)
从耦合关系谈起 耦合关系直接决定着软件面对变化时的行为 -模块与模块之间的紧耦合使得软件面对变化时,相关模块都要随之更改 -模块与模块之间的松耦合使得软件面对变化时,一些模块更容易被替换或者更改,但其 ...
- C#面向对象设计模式纵横谈——5.Factory Method 工厂方法模式(创建型模式)
动机 (Motivation) 在软件系统中,经常面临着“某个对象”的创建工作; 由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何应对这种变化?如何提供一种“封装机制” ...
- C#面向对象设计模式纵横谈——2.Singleton 单件(创建型模式)
一:模式分类 从目的来看: 创建型(Creational)模式:负责对象创建. 结构型(Structural)模式:处理类与对象间的组合. 行为型(Behavioral)模式:类与对象交互中的职责分配 ...
- java设计模式:简单实现生产者和消费者模式
*博客搬家:初版发布于 2016/04/15 20:31 原博客地址:https://my.oschina.net/sunqinwen/blog/660881 本实例中单独为生产者和消费者各开辟 ...
- Factory Method 工厂方法模式
Factory method工厂方法模式是一种实现了“工厂”概念的面向对象设计模式.就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题.工厂方法模式的实质是“定义一个创建对象 ...
- .NET设计模式(13):享元模式(Flyweight Pattern)(转)
摘要:面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题.但是在某些情况下,对象的数量可能会太多,从而导致了运行时的代价.那么我们如何去避免大量细粒度的对象,同时又不影响客户程序使用面 ...
- 设计模式---数据结构模式之迭代器模式(Iterate)
一:概念 迭代模式是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator(遍历)按顺序进行遍历访问的设计模式. 在应用Iterator模式之前,首先应该明白Iterator ...
- 设计模式之模版方法模式(Template Method Pattern)
一.什么是模版方法模式? 首先,模版方法模式是用来封装算法骨架的,也就是算法流程 既然被称为模版,那么它肯定允许扩展类套用这个模版,为了应对变化,那么它也一定允许扩展类做一些改变 事实就是这样,模版方 ...
随机推荐
- 机器学习-非线性回归(Logistic Regression)及应用
1. 概率 1.1 定义:概率(Probability):对一件事情发生的可能性的衡量. 1.2 范围:0 <= P <= 1 1.3 计算方法: 1.3.1 根据个人置信 1.3.2 根 ...
- 工具使用——VMware安装及使用
一.VMware的安装 本文使用VMware 14 pro,双击打开安装包,点击下一步: 选中我接受许可协议中的条款,点击下一步: 选择安装路径,点击下一步: 点击下一步: 点击下一步: 点击安装: ...
- laravel5.8 eloquent
https://learnku.com/docs/laravel/5.8/eloquent/3931 示例1: $flights = App\Flight::all(); foreach ($flig ...
- Java函数优雅之道
https://www.cnblogs.com/amap_tech/p/11320171.html 导读 随着软件项目代码的日积月累,系统维护成本变得越来越高,是所有软件团队面临的共同问题.持续地优化 ...
- 在centOS7.2上编译gcc4.1.2
1.下载安装gcc4.1.2安装包 wget ftp://ftp.gnu.org/gnu/gcc/gcc-4.1.2/gcc-4.1.2.tar.bz2 注:其他版本的安装包可以在上级目录寻找到. ...
- Nginx Location规则
Nginx由内核和模块组成,其中内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端的请求映射到一个location block,而location是Nginx配置中的一个指令 ...
- Big Data(六)用户权限实操&HDFS-API实操
创建用户实操 1.创建用户god useradd god passwd god 2.设置ssh免密 ssh-copy-id -i id_dsa node02 3.修改hdfs-site.xml中的ss ...
- 牛客练习赛26B 烟花 (概率DP)
链接:https://ac.nowcoder.com/acm/contest/180/B 来源:牛客网 烟花 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5 ...
- 清北学堂提高突破营游记day2
先水了一下昨天没讲完的贪心. 然后今天讲的分治. 安利自己水的二分与三分. 二分一定要满足有序.三分适合解决单峰函数问题. 第一道题借教室.运用差分和二分查找. 三分: P1731 [NOI1999] ...
- ZROI 19.08.05模拟赛
传送门 写在前面:为了保护正睿题目版权,这里不放题面,只写题解. A \(21pts:\) 随便枚举,随便爆搜就好了. \(65pts:\) 比较显然的dp,设\(f_{i,j,k}\)表示在子树\( ...