文档
接口类和抽象类以及设计模式,PHP-面向对象教程-慕课网
接口编程 - 学习/实践_william_n的博客-CSDN博客
设计模式之美_设计模式_代码重构-极客时间
PHP 设计模式系列 | Laravel 学院
https://medium.com/frontend-canteen/useful-design-patterns-48ac739882a4 -- JS,常用的三种设计模式
设计模式有23种 [有言25种]
设计模式与编程语言无关,设计模式本质是一种经验总结,'最佳'实践 [个人认为没有‘最’,只有‘更’]
表现语言: PHP
个人主编程语言为PHP [过不去的梗儿:PHP是世界上最好的语言]
这里只介绍 单例模式 与 工厂模式 1. 单例模式
简单说
就是对象只是实例化一次.
优点
节省内存[更直白点,节省钱]
一、实例控制
单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
二、灵活性
因为类控制了实例化过程,所以类可以灵活更改实例化过程。
缺点
一、开销
虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。
二、可能的开发混淆
使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
三、对象生存期
不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于.NET Framework的语言),只有单例类能够导致实例被取消分配,因为它包含对该实例的私有引用。
引出话题↓ 在一个php文件中,某类实例化了若干次,而且又被其他文件include/require很多次,想想会产生多少相同的对象呢?! test.php
<?php
// 定义一个空类 class Test { // code here }
$test1 = new Test(); $test2 = new Test(); $test3 = new Test(); $test4 = new Test();
var_dump($test1); var_dump($test2); var_dump($test3); var_dump($test4);
输出打印:下面的红色数字是对象实例ID --- 这个是非常有用的,可以帮助我们确认对象是否为同一个对象
object(Test)#1 (0) { }
object(Test)#2 (0) { }
object(Test)#3 (0) { }
object(Test)#4 (0) { }
由此可看到是实例化产生了四个对象
现将code做如下改变: [单例模式] singleton.php
<?php
class Singleton { private static $_instance = null;
// 构造方法私有化, 则类无法在实例化, 即无法直接new private function __construct() { // Code here }
// 为了严谨, 使用__clone魔术方法, 并私有化, 即 类不能通过复制clone产生对象 private function __clone() { // Code here }
// 定义一个在类外能够实例化类的方法, 一定要是public访问修饰符 public static function getInstance() { if (!(self::$_instance instanceof self)) self::$_instance = new self(); return self::$_instance;
} }
$singleton1 = Singleton::getInstance(); $singleton2 = Singleton::getInstance(); $singleton3 = Singleton::getInstance(); $singleton4 = Singleton::getInstance();
var_dump($singleton1); var_dump($singleton2); var_dump($singleton3); var_dump($singleton4);
打印结果如下:
object(Singleton)#1 (0) { }
object(Singleton)#1 (0) { }
object(Singleton)#1 (0) { }
object(Singleton)#1 (0) { }
可以看到实例化只产生了一个对象
Code 参见: learning_of_php/高级编程/设计模式/创建型/单例模式 at master · ningxiaofa/learning_of_php · GitHub 总结
这就是单例模式 , 框架中常使用, 有时候不理解, 但不是最重要的点, 首先会使用更重要,
而且有时用的过程突然可能就明白了, 建议自己默写两遍, 并且想着在工作中应用.
2. 工厂模式
用途:主要是负责用来创建[同样功能的]类的实例【对比思考跟单例模式的区别】
比如:项目需要一个缓存类【有些数据要放在缓存里面】
常用的缓存有: Memcached, Redis等。
现在简单封装一个Memcacehed操作类, 只是具有少量的方法 Memcached.php
<?php
class Memcached { public function set($key, $value) { // Code here }
public function get($key) { // Code here }
public function delete($key) { // Code here }
}
然后我们要很多地方操作我们的缓存的时候, 就需要 new Memcached 这个类
$cache = new Memcached(); // 调用处1
$cache = new Memcached(); // 调用处2,调用处3 ....
但是正如上面所说, 会在很多地方调用, 就会散落在项目代码的很多地方, 有一天老板说, 诶, 这个Memcached感觉不够用了, 现在要换成Redis, 那这时候就糟糕了, 替换得翻多少代码去修改呢 [工作量可能不小, 而且还不能完全保证修改完毕, 一个不剩] 上面的代码要全部改成: Memcached 的类要改成 Redis, 而且调用的地方也要改成 Redis
$cache = new Redis(); // 调用处1
$cache = new Redis(); // 调用处2, 调用处3 ....
有没有解决办法?
有,使用工厂模式, 定义一个Cache类 ,【个人看来】是为了更好的维护代码, 或者说可扩展性,减轻开发者的麻烦,有时候常常是减轻自己的麻烦 ----- 当学习了很多的设计模式之后,你会发现设计模式的本质用处都是为了使得代码易扩展,易维护,其他没什么作用
Cache.php
<?php
class Cache { public static function factory() { return new Memcached();
// 如果由于项目变化, 要使用Redis, 则只需要改变这一个地方就可以了, 如下: // return new Redis(); // 使用Redis } }
demo.php
$cache = Cache::factory(); $cache->set('hello', 'world'); $cache->get('hello'); $cache->delete('hello');
上面还有一个优化↓
首先定义一个接口Cache, Cache类实现该接口,
接口主要用来约束, 接口/类的方法, 适用于团队/代码规模较大
完整代码:共计三[也可以两]个文件[具体实现类文件,接口定义文件,工厂类] Code参见: learning_of_php/高级编程/设计模式/创建型/工厂模式/简单工厂模式 at master · ningxiaofa/learning_of_php · GitHub Memcached.php
<?php
// 具体的实现类
class Memcached implements CacheInterface { public function set($key, $value) { // ... echo 'set...'; }
public function get($key) { // ... echo 'get...'; }
public function delete($key) { // ... echo 'delete...'; }
}
// 定义接口 interface CacheInterface {
public function set($key, $value);
public function get($key);
public function delete($key); }
// 抽象工厂类 class Cache { public static function factory() {
// 使用Memcached return new Memcached();
// 使用Redis // return new Redis(); } }
$cache = Cache::factory(); $cache->set('hello', world'); $cache->get('hello'); $cache->delete('hello');
另附上极客时间专栏 <<设计模式之美>> 的大纲 原图↓
https://static001.geekbang.org/resource/image/f3/d3/f3262ef8152517d3b11bfc3f2d2b12d3.png
3. 更多设计模式系列 PHP 设计模式系列 | Laravel 学院 // 学院君 - PHP 设计模式系列 - 20191126 - 推荐 后续补充 ... |