PHP面向对象-设计模式 单例模式 简单工厂模式 工厂方法模式

1.单例模式

  单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。

  要实现每一个类只有一个实例,就需要对实例化进行限制。

  单例模式实现要点: 

   ① 构造函数私有化,不允许使用new关键字创建对象
   ② 对外提供获取对象的方法。在方法中判断对象是否为空,如果为空则创建对象并返回,如果不为空则直接返回
   ③ 实例对象的属性以及获取对象的方法必须是静态的
   ④ 之后,创建对象只能使用我们提供的静态方法。 

  PHP实现单例模式代码如下:

 1 class Singleton{
 2         static private $Single = null;
 3
 4         //构造函数私有化,不准使用new关键字创建对象
 5         private function __construct(){}
 6
 7         static function getSingle(){
 8             if(!self::$Single){
 9 //                self::$Single = new Singleton();//new self();
10                 self::$Single = new self();//和上面的语句等价
11                 //上述语句完成了在类中通过静态方法创建对象并返回。
12                 //self代指类名 new Singleton() 和new self()完全一样;
13             }
14             return self::$Single;
15         }
16 }

  最后将其实例化,并且只能使用类中提供的方法。

    $singletonInstance = Singleton::getSingle();

  上述代码中,使用私有的静态变量和静态方法,通过类的静态方法创建实例,并且进行判断,如果第一次进行实例化,则成功,否则实例化失败。如此一来,每个类只有一个实例,因而实现了单例模式。

  

2.简单工厂模式

  工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。这样可以让程序耦合度降低,实现解耦。

  简单工厂模式PHP代码如下:

 1     interface Product{
 2         function productFunc();
 3     }
 4
 5     class Product1 implements Product{
 6         function productFunc(){
 7             echo "this is ProductA function";
 8         }
 9     }
10
11     class Product2 implements Product{
12         function productFunc(){
13             echo "this is ProductB function";
14         }
15     }
16
17     class Factory{
18         static function createPro($pro){
19              switch ($pro) {
20                  case ‘ProductA‘:
21                      return new ProductA();
22                      break;
23                  case ‘ProductB‘:
24                      return new ProductB();
25                      break;
26                 default:
27                      break;
28             }
29         }
30     }
31
32     $proInstance1 = Factory::createPro("ProductA");
33     $proInstance2 = Factory::createPro("ProductB");
34     $proInstance1->productFunc();
35     $proInstance2->productFunc();

3.工厂方法模式

  在原有的简单工厂模式的基础上,我们将工厂类也抽象出来,让工厂的子类去完成具体的工作。

  工厂方法模式的PHP代码如下:

 1 interface Product{
 2         function productFunc();
 3     }
 4
 5     class Product1 implements Product{
 6         function productFunc(){
 7             echo "this is ProductA function";
 8         }
 9     }
10
11     class Product2 implements Product{
12         function productFunc(){
13             echo "this is ProductB function";
14         }
15     }
16
17     //将工厂抽象出来,生产不同产品的具体功能交给他的子类完成
18     interface Factory{
19         function create();
20     }
21
22     //子类工厂A生产产品1
23     class FactoryA implements Factory(){
24         static function create(){
25             echo "this factory create ProductA";
26             return new Product1();
27         }
28     }
29     //子类工厂B生产产品2
30     class FactoryB implements Factory(){
31         static function create(){
32             echo "this factory create ProductB";
33             return new Product2();
34         }
35     }
36
37     $pro1 = FactoryA::create();
38     $pro2 = FactoryB::create();
39     $pro1->productFunc();
40     $pro2->productFunc();

  

  以上为单里模式,简单工厂模式,工厂方法模式,的简单,后期还会在此更新其他的设计模式。(未完待续)

时间: 2024-11-08 21:11:06

PHP面向对象-设计模式 单例模式 简单工厂模式 工厂方法模式的相关文章

23种设计模式(6):模版方法模式

定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤. 类型:行为类模式. 类图: 事实上,模版方法是编程中一个经常用到的模式.先来看一个例子,某日,程序员A拿到一个任务:给定一个整数数组,把数组中的数由小到大排序,然后把排序之后的结果打印出来.经过分析之后,这个任务大体上可分为两部分,排序和打印,打印功能好实现,排序就有点麻烦了.但是A有办法,先把打印功能完成,排序功能另找人做. abstract class AbstractS

C#面向对象设计模式纵横谈——2.Singleton 单件(创建型模式)

一:模式分类 从目的来看: 创建型(Creational)模式:负责对象创建. 结构型(Structural)模式:处理类与对象间的组合. 行为型(Behavioral)模式:类与对象交互中的职责分配. 从范围来看: 类模式处理类与子类的静态关系. 对象模式处理对象间的动态关系. 二:Singleton (创建型模式) 单件 1.动机(Motivation) 软件系统中,经常有这样一些特殊的类,必须保证他们在系统中只存在一个实例,才能确保它们的逻辑正确性,以及良好的效率. 如何绕过常规的构造器,

java常用设计模式--单例模式简单例子

package com.ruanyun; /** * @Auther: maxw * @Date: 2018/11/10 17:29 * @Description: */public class Test4 { public static void main(String args[]){ F99 f99 = F99.getInstance(); F99 f100 = F99.getInstance(); System.out.println(f99==f100); }}//假设 F99战机 只

设计模式----单例模式的两种创建方法

一.实现单例模式的需要的条件: 1,有私有的构造器; 2,一个静态方法; 3,一个静态变量. 二.实现单例模式的两种方法: 第一种:急切实例化 package singleton; /** * 急切实例化 * @author lenovo * */ public class Singleton2 { private static Singleton2 uniqueInstance = new Singleton2(); private Singleton2(){ } public static

23中设计模式----------模版方法模式

模板方法模式: 模板方法模式,就是定义一个操作中的算法框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构可重新定义该算法的某些特定步骤. 简而言之,就是定义一个抽象类,在该抽象类中,有一些需要子类特定实现的方法,和一个基本已经实现不改变的方法,而在这个固定的方法中调用那些需要子类实现的方法,从而达到一些步骤延迟到子类中. 所以,在模板方法模式中一般有两类方法: 1,基本方法. 该方法是由子类实现的,并且在模板方法被调用. 2,模板方法. 一般是一个具体的方法,实现对基本方法的调度,

Factory Method 工厂方法模式

Factory method工厂方法模式是一种实现了“工厂”概念的面向对象设计模式.就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题.工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类.工厂方法让类的实例化推迟到子类中进行.” 创建一个对象常常需要复杂的过程,所以不适合包含在一个复合对象中.创建对象可能会导致大量的重复代码,可能会需要复合对象访问不到的信息,也可能提供不了足够级别的抽象,还可能并不是复合对象概念的一部分.工厂方法模式通

.NET设计模式(13):享元模式(Flyweight Pattern)(转)

摘要:面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题.但是在某些情况下,对象的数量可能会太多,从而导致了运行时的代价.那么我们如何去避免大量细粒度的对象,同时又不影响客户程序使用面向对象的方式进行操作? 本文试图通过一个简单的字符处理的例子,运用重构的手段,一步步带你走进Flyweight模式,在这个过程中我们一同思考.探索.权衡,通过比较而得出好的实现方式,而不是给你最终的一个完美解决方案. 主要内容: 1.  Flyweight模式解说 2..NET中的Flyweight

设计模式之模版方法模式

1.模版方法模式简介: a.模版方法模式的简单介绍: -  模版方法模式是编程中经常用到模式.它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现.这样,新的子类可以在不改变一个算法结构的前提上重新定义该算法的某些特定步骤. b.核心:处理某个流程中的代码已经都具备,但是其中某个节点的代码暂时不能确定.因此,我们采用模版方法模式,将这个节点的代码实现转移给子类中完成.即:处理步骤父类中定义好,具体实现延迟到子类中定义. 2.简单的代码演示: 在 BankTemplateMethod 类中添加

25行为型模式之迭代器模式

概念 Iterator模式也叫迭代模式,是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator(遍历)按顺序进行遍历访问的设计模式. 在应用Iterator模式之前,首先应该明白Iterator模式用来解决什么问题.或者说,如果不使用Iterator模式,会存在什么问题. 1.由容器自己实现顺序遍历.直接在容器类里直接添加顺序遍历方法 2.让调用者自己实现遍历.直接暴露数据细节给外部. 以上方法1与方法2都可以实现对遍历,这样有问题呢? 1,容器类承担了太多功能:一方