Learning PHP Design Patterns.设计模式的宗旨就是重用,应用设计模式可以使我们的代码更加优雅、简洁、低耦合。
一、单例模式
1.什么是单例模式:
一个类最多只能产生一个对象,如果希望在系统中某个类(链接数据库的类)的对象只能存在一个,单例模式是最好的解决方案。
2.单利模式的实现:三私一公
①私有化构造方法:防止实例化
②私有化克隆方法:防止克隆
③私有化静态属性:保存对象
④私有化静态方法:获取对象
3.代码实现
class Singleton{
private static $obj;//私有化静态属性
private function __construct(){
//私有化构造方法
}
private function __clone(){
//私有化克隆方法
}
//静态方法产生对象
static public function getInstance(){
//对象不存在new一个对象
if(!is_object(self::$obj)){
self::$obj = new Singleton();
}
return self::$obj;
}
}
4.测试单例模式
//无法实例化,可以防止new实例化这个类,强制使用getInstance方法,创建对象
$obj1 = new Singleton;
var_dump($obj1);
//成功获取对象
$obj2 = Singleton::getInstance();
var_dump($obj2);
//无法克隆
$obj3 = clone $obj2;
var_dump($obj3);
二、工厂模式
这也是一个很基本,很简单,很常用的设计模式。
本来我们要获取一个类的实例,需要用到new关键字。但是如果new 直接写到业务代码里,一个类在很多地方都实例化过,以后要是这个类出了什么问题,比如要改个名字(实际中,你更多的可能是修改构造函数方法),那么就尴尬了,需要改很多地方。
工厂模式
,顾名思义,就是不用new来获得实例,而是把业务类放进一个工场类里,由工厂(类)『生产』出对应的实例
。
实现
SimpleFactory.php
<?php
namespace DesignPatterns\Creational\SimpleFactory;
class SimpleFactory
{
public function createBicycle(): Bicycle
{
return new Bicycle();
}
}
Bicycle.php
<?php
namespace DesignPatterns\Creational\SimpleFactory;
class Bicycle
{
public function driveTo(string $destination)
{
}
}
使用
$factory = new SimpleFactory();
$bicycle = $factory->createBicycle();
$bicycle->driveTo('Paris');
我们需要什么样的实例,就到工厂的实例方法里去拿。这里只定义了一个类的实例,你可以定义更多。
我们看到,业务代码里没有出现 new以及那个具体的业务类, 这样 业务类(class Bicycle)我们可以随便改,以后更新的时候只要在工厂类(class SimpleFactory)里修改一次,就可以一对多的在各处生效了。
但是,这个方法名字 $factory->createBicycle();
你得起好,如果你要改这个名字,还是得到多个地方改的。
工厂的作用,简而言之,就是在工厂里边创建业务需要的实例对象,然后,在业务层创建工厂对象调用里边相关的创建对象方法即可。
总结
工厂类必须有一个工厂方法;
工厂方法必须能够返回一个其他类的实例;
一次只能创建和返回一个实例;
三、PHP设计模式汇总
相关文章:
php设计模式之单例模式
TIGERB的:一个php技术栈后端猿的知识储备大纲
php 设计模式之工厂模式、单例模式、注册树模式