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();

 

  

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

 

posted @ 2017-06-12 08:31  奶油面包好好吃啊  阅读(275)  评论(0编辑  收藏  举报