首页 > 代码库 > 设计模式笔记

设计模式笔记

个人理解:特定场景下,前辈对该问题合理处理方式的总结。设计模式不是为了设计模式而模式,是为了更好的处理问题,更好的提高程序的扩展性,健壮性,可读性,降低程序的复 杂性。在自己的程序中如遇相似的场景,借鉴使用,会起到指导性的作用,会达到事半功倍的效果。

开放封闭原则:软件实体(类、模块、函数等)应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。这样可以避免以后需要做修改的时候误删了原来其他部分的代码或出现其他的情况。我觉得也更好的提高了代码的可读性。

多态:面向对象的三大特性为封装、继承、多态。其中多态的理解就是多种状态。比如快捷键f1,在打开word的情况下出现word的帮助,在wps打开状态下就到了wps指南网址,picpick就到了他的帮助网址,其他软件可能同理调用自己的帮助吧。再比如写了一个people类,实例化时张三和李四都有各自的属性,这就是多个状态吧。

面向接口开发:现实中的例子,插头和插座生产厂家没有相互协商但是产品能用,因为他们遵循了行业的规范。

一、单例模式

特点:三私一公

单例模式是一种常见的设计模式,在计算机系统中,线程池、缓存、日志对象、对话框、打印机、数据库操作、显卡的驱动程序常被设计成单例。

单例模式分3种:懒汉式单例、饿汉式单例、登记式单例。

$_instance必须声明为静态的私有变量,保存类的实例

之所以属性和getinstance方法声明为静态,因为为了防止外界实例化类,构造函数已经声明为私有了,就不能够创建对象,不能通过对象调用方法。单例是自己创建对象,将方法声明为static类自己就可以自己调用了,属性同理。

可以参考博文http://www.cnblogs.com/hongfei/archive/2012/07/07/2580994.html

<?php
class Person{
         private static $_instance;//属性为静态
	 private function __construct(){//私有化为了防止类外调用
	 
	 }
	 private function __clone(){//私有化为了防止类外调用
	 
	 }
	 public static function getInstance(){//因为没有创建类的对象就不能用对象调用方法,所以声明为静态
	      if(self::$_instance===null){
		       self::$_instance=new self();
		  }
		  return self::$_instance;
	 }
}
$s1=Person::getInstance();
$s2=Person::getInstance();
if($s1==$s2){
   echo "同一实例"; 
}else{
     echo "不同实例"; 
}

二、工厂模式

根据抽象程度不同,PHP工厂模式分为:简单工厂模式、工厂方法模式和抽象工厂模式

综合介绍工厂模式的三种博文http://www.phpddt.com/php/php-factory.html

①简单工厂模式

简单工厂模式又叫静态工厂方法模式,因为简单工厂模式是通过一个静态方法创建对象的

这里有个博客介绍简单工厂模式很清楚http://www.cnblogs.com/hongfei/archive/2012/07/07/2580776.html

但是简单工厂模式修改时候,没遵循开放封闭原则。

<?php
//抽象基类,或者用借口定义也行
abstract class Cal{
   abstract public function deal($one,$two);
}
class Add extends Cal{
    public function deal($one,$two){
	      return $one+$two;
	}
} 
class Sub extends Cal{
    public function deal($one,$two){
	      return $one-$two;
	}
} 
//主要用来创建对象
class Factory{
	 // 简单工厂里的静态方法
      public static function create($type){
	      if($type=="Add"){
		        return new Add();
		  }elseif($type=="Sub"){
		        return new Sub();
		  }else{
		      throw new Exception("error type",1);
		  }
	  
	  }
}
/*
//或每个类定义一个静态方法
class Factory{
	 // 简单工厂里的静态方法
     static function createAdd() {
        return new Add();
    }
	static function createSub() {
         return new Sub();
    }
}
*/

$add=Factory::create("Add");
echo $add->deal(2,3);
$sub=Factory::create("Sub");
echo $sub->deal(6,3);

 ②工厂方法模式

给创建对象的类定义一个基类或者接口

<?php
//抽象基类,或者用借口定义也行
abstract class Cal{
   abstract public function deal($one,$two);
}
class Add extends Cal{
    public function deal($one,$two){
	      return $one+$two;
	}
} 
class Sub extends Cal{
    public function deal($one,$two){
	      return $one-$two;
	}
} 
//主要用来创建对象
Interface Factory{
      public function create();

}
class FactoryAdd implements Factory{
     public function create(){
	    return new Add();
	 }
}

class FactorySub implements Factory{
     public function create(){
	    return new Sub();
	 }
}

$add=new FactoryAdd();
$objadd=$add->create();
echo $objadd->deal(2,3);
$sub=new FactorySub;
$objsub=$sub->create();
echo $objsub->deal(6,3);

 ③抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口

<?php
//抽象基类,或者用借口定义也行
abstract class Cal{
   abstract public function deal($one,$two);
}
class Add extends Cal{
    public function deal($one,$two){
	      return $one+$two;
	}
} 
class Sub extends Cal{
    public function deal($one,$two){
	      return $one-$two;
	}
} 
//主要用来创建对象
Interface Factory{
      public function createA();
      public function createB();

}
class FactoryAdd implements Factory{
     public function createA(){
	    return new Add();
	 }
	  public function createB(){
	    return new Sub();
	 }
}


$factory=new FactoryAdd();
$objadd=$factory->createA();
echo $objadd->deal(2,3);
$objsub=$factory->createB();
echo $objsub->deal(6,3);

 三、观察者模式

 

设计模式笔记