设计模式中类之间的关系:
? ??面向对象设计模式中,类与类之间主要有6种关系,他们分别是:依赖、关联、聚合、组合、继承、实现。他们的耦合度依次增强
一、 单例模式
? ??1.单例模式 实例化出来的对象是唯一的
? ? ????1). $_instance必须声明为静态的私有变量
? ? ????2). 构造函数和析构函数必须声明为私有,防止外部程序new 类从而失去单例模式的意义
? ????? 3). getInstance()方法必须设置为公有的,必须调用此方法 以返回实例的一个引用
? ? ????4). ::操作符只能访问静态变量和静态函数
? ? ????5). new对象都会消耗内存
? ? ????6). 使用场景:最常用的地方是数据库连接。
? ? ????7). 使用单例模式生成一个对象后, 该对象可以被其它众多对象所使用。
? ? ????8). 私有的__clone()方法防止克隆对象
????2. 单例模式分3种:懒汉式单例、饿汉式单例、登记式单例
????3. 代码
????class Singlemodel{
????/**
? ? ? ? * 保存Singlemodel实例的变量
? ???? * @var Singlemodel $_instance
????*/
????private static $_instance = null;
????????/**
? ? ? ? * 屏蔽掉通过new来实例化该对象
? ???? */
????private function __construct(){
? ? ? ? ? ? //空函数就行
????? }
????/**
? ? ? ? * 屏蔽掉通过clone来克隆该对象
????? */
????private function __clone(){
? ? ? ? ? ? //空函数就行
????? }
????/**
? ? ? ? * 通过该方法获取实例,防止多次实例化
? ???? */
????public static function getInstance(){
????????if(!(self::$_instance instanceof self)){
????????????self::$_instance = new self();
? ? ? ?}
????????return self::$_instance;
????}
}
? ? 二、.观察者模式
? ??????1. 特点
? ? ????????1):观察者模式(Observer),当一个对象状态发生变化时,依赖它的对象全部会收到通知,并自动更新
? ? ????????2):场景:一个事件发生后,要执行一连串更新操作。传统的编程方式,就是在事件的代码之后直接加入处理的逻辑。
当更新的逻辑增多之后,代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件的主体代码
? ? ????????3):观察者模式为您提供了避免组件之间紧密耦合的一种方法
? ????????? 4). 观察者可以向主题注册和解除注册,主题状态改变通过注册的观察者接口通知观察者,让观察者做相应的业务
? ? ? ?2. 场景
? ? ? ? ?典型的:用户注册(验证邮件,用户信息激活),购物网站下单时邮件/短信通知等
三、工厂模式
? ??1. 优点
? ? 1). 在创建对象上 把创建对象的过程封装起来 减少代码进行复制粘帖,耦合关系重,牵一发动其他部分代码
? ? 2). 可以根据不同的参数生成不同的类实例,那么就符合工厂模式的设计思想
2. 应用
? ? 1). 支付接口的时候,可能对应不同的支付网关:支付宝、财付通、网银在线等。方便未来扩展,设计成工厂模式。
? ? ? ? 定一个专门生产网关接口的工厂,抽象出来,做成接口形式,让所有的子类都要实现它的接口。
以后加一个支付方式,要使用哪一种支付方式,改变一下参数即可
? ? 2). 在为用户注册的时候,分为很多种角色的用户。比如册用户,匿名用户、管理员用户等。
? ? ? ? 完全使用可以使用工厂的思想来实现,代码也容易维护,为每种角色可以生成操作的类
3. 代码
interface IUser
{
????????function getName();
}
class User implements IUser
{
????public function __construct( $id ) { }
????public function getName()
????{
????????return "Jack";
????}
}
? ? ?#UserFactory 工厂类
? class UserFactory
{
public static function Create( $id )
{
????????return new User( $id );
}
}
$uo = UserFactory::Create( 1 );
echo( $uo->getName()."\n" );
?>