<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>设计模式 on Leanku 的博客</title><link>https://www.leanku.com/tags/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/</link><description>Recent content in 设计模式 on Leanku 的博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Mon, 13 Oct 2025 21:46:01 +0800</lastBuildDate><atom:link href="https://www.leanku.com/tags/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/index.xml" rel="self" type="application/rss+xml"/><item><title>设计模式原则</title><link>https://www.leanku.com/post/designpattern/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E5%8E%9F%E5%88%99/</link><pubDate>Mon, 13 Oct 2025 21:46:01 +0800</pubDate><guid>https://www.leanku.com/post/designpattern/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E5%8E%9F%E5%88%99/</guid><description>&lt;h1 id="设计模式原则"&gt;设计模式原则&lt;/h1&gt;&#10;&lt;p&gt;设计模式的原则是理解和使用设计模式的基石。这些原则是面向对象设计的核心指导思想，设计模式本身就是这些原则在特定场景下的具体体现。&lt;/p&gt;&#10;&lt;p&gt;最重要的设计原则是 SOLID 原则，此外还有一些其他关键原则。&lt;/p&gt;&#10;&lt;h2 id="一-solid-原则"&gt;一、 SOLID 原则&lt;/h2&gt;&#10;&lt;p&gt;SOLID 原则是五个最常用、最经典的设计原则，由 Robert C. Martin 提出。&lt;/p&gt;&#10;&lt;h3 id="1-单一职责原则"&gt;1. 单一职责原则&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;核心思想&lt;/strong&gt;： 一个类应该只有一个引起变化的原因。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;详细解释&lt;/strong&gt;：一个类只负责一项职责或功能。如果一個类承担的功能过多，就等于把这些职责耦合在一起，一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;比喻&lt;/strong&gt;： 一家餐厅，厨师负责做饭，服务员负责点菜和上菜，清洁工负责打扫。如果他们职责混杂，效率就会低下。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;违反示例&lt;/strong&gt;： 一个 UserService 类，既负责用户信息的增删改查，又负责将用户数据导出为PDF报表，还负责发送邮件通知。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;修正&lt;/strong&gt;： 将 UserService 拆分为 UserService（用户业务逻辑）、UserReportGenerator（报表生成）和 EmailService（邮件服务）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="2-开闭原则"&gt;2. 开闭原则&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;核心思想： 软件实体（类、模块、函数等）应该对扩展开放，对修改关闭。&lt;/li&gt;&#10;&lt;li&gt;详细解释： 当需求发生变化时，我们应该通过添加新的代码来扩展功能，而不是修改已有的、已经工作正常的代码。这是最重要的原则，是很多设计模式的目标。&lt;/li&gt;&#10;&lt;li&gt;比喻： 一台电脑，你可以扩展USB设备（鼠标、键盘、硬盘），而无需为了支持新设备而拆开主机修改主板。&lt;/li&gt;&#10;&lt;li&gt;违反示例： 一个 AreaCalculator 类，有一个 calculate 方法，里面用 if-else 来判断是圆形还是矩形来计算面积。如果要增加三角形，就必须修改这个类的代码。&lt;/li&gt;&#10;&lt;li&gt;修正： 定义一个 Shape 接口，包含 calculateArea 方法。让 Circle 和 Rectangle 类实现这个接口。AreaCalculator 只需遍历 Shape 列表调用其方法即可。要新增三角形，只需创建 Triangle 类实现 Shape，无需修改任何现有类。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="3-里氏替换原则"&gt;3. 里氏替换原则&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;核心思想： 所有引用基类的地方必须能透明地使用其子类的对象。&lt;/li&gt;&#10;&lt;li&gt;详细解释： 子类必须能够完全替代它们的父类，而不产生任何错误或意外的行为。也就是说，子类只能在保持原有行为的基础上进行扩展，而不能覆盖或改变父类的核心行为。&lt;/li&gt;&#10;&lt;li&gt;比喻： 你父亲会开车，你作为儿子继承了他，你也会开车（保持了父亲的行为），但你可能会开得更快或者还会修车（扩展），你绝不能把“开车”这个行为重定义为“游泳”。&lt;/li&gt;&#10;&lt;li&gt;违反示例： Rectangle 类有 setWidth 和 setHeight 方法。Square 类继承 Rectangle，并重写了 setWidth 和 setHeight，使其同时设置宽和高。那么，一个接收 Rectangle 参数并调整其宽高的函数，如果传入一个 Square 对象，就会得到错误的结果。&lt;/li&gt;&#10;&lt;li&gt;修正： 重新考虑继承关系，或者让 Rectangle 和 Square 都实现一个 Shape 接口，而不是使用继承。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="4-接口隔离原则"&gt;4. 接口隔离原则&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;核心思想： 客户端不应该被迫依赖于它不使用的接口。&lt;/li&gt;&#10;&lt;li&gt;详细解释： 将一个庞大的、臃肿的接口拆分成更小、更具体的接口，使得客户端只需要知道它们感兴趣的方法。这样可以避免实现类被迫实现一些它们根本用不到的方法。&lt;/li&gt;&#10;&lt;li&gt;比喻： 一台多功能打印机，有打印、复印、传真功能。如果做一个全能接口，老式打印机（只能打印）实现这个接口时，复印和传真方法只能空着或抛异常。不如拆分成 Printer、Scanner、Faxer 三个接口。&lt;/li&gt;&#10;&lt;li&gt;违反示例： 一个 Animal 接口，有 eat(), fly(), swim() 方法。Dog 类实现它时，fly() 方法只能空实现。&lt;/li&gt;&#10;&lt;li&gt;修正： 将 Animal 拆分为 Eatable, Flyable, Swimmable 等更精细的接口。Dog 实现 Eatable 和 Swimmable 即可。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="5-依赖倒置原则"&gt;5. 依赖倒置原则&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;核心思想：&#10;&lt;ul&gt;&#10;&lt;li&gt;高层模块不应该依赖于低层模块，二者都应该依赖于抽象。&lt;/li&gt;&#10;&lt;li&gt;抽象不应该依赖于细节，细节应该依赖于抽象。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;详细解释： 要面向接口编程，而不是面向实现编程。这减少了类间的耦合性，提高了系统的稳定性。&lt;/li&gt;&#10;&lt;li&gt;比喻： 你想读书（高层），你不应该直接依赖一本具体的纸质书（低层），而应该依赖于“书本”这个抽象概念。这样，无论是纸质书、电子书还是有声书，你都可以“读”。&lt;/li&gt;&#10;&lt;li&gt;违反示例： UserService 类内部直接 new 了一个 MySQLDatabase 对象。如果将来要换用 OracleDatabase，就必须修改 UserService 的代码。&lt;/li&gt;&#10;&lt;li&gt;修正： 定义一个 Database 接口。UserService 的构造函数接收一个 Database 类型的参数。这样，UserService 依赖于抽象的 Database，而 MySQLDatabase 和 OracleDatabase 都实现这个接口。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="其他重要原则"&gt;其他重要原则&lt;/h2&gt;&#10;&lt;p&gt;除了 SOLID，还有一些非常实用的原则。&lt;/p&gt;</description></item><item><title>PHP中的设计模式</title><link>https://www.leanku.com/post/php/php%E4%B8%AD%E7%9A%84%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/</link><pubDate>Fri, 15 Mar 2024 13:46:01 +0800</pubDate><guid>https://www.leanku.com/post/php/php%E4%B8%AD%E7%9A%84%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/</guid><description>&lt;h1 id="php中的设计模式"&gt;PHP中的设计模式&lt;/h1&gt;&#10;&lt;h2 id="介绍"&gt;介绍&lt;/h2&gt;&#10;&lt;pre&gt;&lt;code&gt;设计模式：提供了一种广泛的可重用的方式来解决我们日常编程中常常遇见的问题。设计模式并不一定就是一个类库或者第三方框架，它们更多的表现为一种思想并且广泛地应用在系统中。它们也表现为一种模式或者模板，可以在多个不同的场景下用于解决问题。设计模式可以用于加速开发，并且将很多大的想法或者设计以一种简单地方式实现。当然，虽然设计模式在开发中很有作用，但是千万要避免在不适当的场景误用它们。&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h2 id="分类"&gt;分类&lt;/h2&gt;&#10;&lt;h3 id="按照目的分目前常见的设计模式主要有23种根据使用目标的不同可以分为以下三大类"&gt;按照目的分，目前常见的设计模式主要有23种，根据使用目标的不同可以分为以下三大类：&lt;/h3&gt;&#10;&lt;h4 id="创建设计模式creational-patterns5种用于创建对象时的设计模式更具体一点初始化对象流程的设计模式当程序日益复杂时需要更加灵活地创建对象同时减少创建时的依赖而创建设计模式就是解决此问题的一类设计模式"&gt;创建设计模式（Creational Patterns）(5种)：用于创建对象时的设计模式。更具体一点，初始化对象流程的设计模式。当程序日益复杂时，需要更加灵活地创建对象，同时减少创建时的依赖。而创建设计模式就是解决此问题的一类设计模式。&lt;/h4&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;单例模式【Singleton】&lt;/li&gt;&#10;&lt;li&gt;工厂模式【Factory】&lt;/li&gt;&#10;&lt;li&gt;抽象工厂模式【AbstractFactory】&lt;/li&gt;&#10;&lt;li&gt;建造者模式【Builder】&lt;/li&gt;&#10;&lt;li&gt;原型模式【Prototype】&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="结构设计模式structural-patterns7种用于继承和接口时的设计模式结构设计模式用于新类的函数方法设计减少不必要的类定义减少代码的冗余"&gt;结构设计模式（Structural Patterns）(7种)：用于继承和接口时的设计模式。结构设计模式用于新类的函数方法设计，减少不必要的类定义，减少代码的冗余。&lt;/h4&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;适配器模式【Adapter】&lt;/li&gt;&#10;&lt;li&gt;桥接模式【Bridge】&lt;/li&gt;&#10;&lt;li&gt;合成模式【Composite】&lt;/li&gt;&#10;&lt;li&gt;装饰器模式【Decorator】&lt;/li&gt;&#10;&lt;li&gt;门面模式【Facade】&lt;/li&gt;&#10;&lt;li&gt;代理模式【Proxy】&lt;/li&gt;&#10;&lt;li&gt;享元模式【Flyweight】&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="行为模式behavioral-patterns11种用于方法实现以及对应算法的设计模式同时也是最复杂的设计模式行为设计模式不仅仅用于定义类的函数行为同时也用于不同类之间的协议通信"&gt;行为模式（Behavioral Patterns）(11种)：用于方法实现以及对应算法的设计模式，同时也是最复杂的设计模式。行为设计模式不仅仅用于定义类的函数行为，同时也用于不同类之间的协议、通信。&lt;/h4&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;策略模式【Strategy】&lt;/li&gt;&#10;&lt;li&gt;模板方法模式【TemplateMethod】&lt;/li&gt;&#10;&lt;li&gt;观察者模式【Observer】&lt;/li&gt;&#10;&lt;li&gt;迭代器模式【Iterator】&lt;/li&gt;&#10;&lt;li&gt;责任链模式【ResponsibilityChain】&lt;/li&gt;&#10;&lt;li&gt;命令模式【Command】&lt;/li&gt;&#10;&lt;li&gt;备忘录模式【Memento】&lt;/li&gt;&#10;&lt;li&gt;状态模式【State】&lt;/li&gt;&#10;&lt;li&gt;访问者模式【Visitor】&lt;/li&gt;&#10;&lt;li&gt;中介者模式【Mediator】&lt;/li&gt;&#10;&lt;li&gt;解释器模式【Interpreter】&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="按照范围分为类的设计模式以及对象设计模式"&gt;按照范围分为：类的设计模式，以及对象设计模式&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;类的设计模式(Class patterns)：用于类的具体实现的设计模式。包含了如何设计和定义类，以及父类和子类的设计模式。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;对象设计模式(Object patterns): 用于对象的设计模式。与类的设计模式不同，对象设计模式主要用于运行期对象的状态改变、动态行为变更等。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="设计模式原则"&gt;设计模式原则&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;设计模式六大原则&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;开放封闭原则：一个软件实体如类、模块和函数应该对扩展开放，对修改关闭。&lt;/li&gt;&#10;&lt;li&gt;里氏替换原则：所有引用基类的地方必须能透明地使用其子类的对象.&lt;/li&gt;&#10;&lt;li&gt;依赖倒置原则：高层模块不应该依赖低层模块，二者都应该依赖其抽象；抽象不应该依赖细节；细节应该依赖抽象。&lt;/li&gt;&#10;&lt;li&gt;单一职责原则：不要存在多于一个导致类变更的原因。通俗的说，即一个类只负责一项职责。&lt;/li&gt;&#10;&lt;li&gt;接口隔离原则：客户端不应该依赖它不需要的接口；一个类对另一个类的依赖应该建立在最小的接口上。&lt;/li&gt;&#10;&lt;li&gt;迪米特法则：一个对象应该对其他对象保持最少的了解。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="设计模式实现"&gt;设计模式实现&lt;/h2&gt;&#10;&lt;h3 id="1-singleton单例模式"&gt;1. Singleton(单例模式)&lt;/h3&gt;&#10;&lt;p&gt;单例模式是最常见的模式之一，在Web应用的开发中，常常用于允许在运行时为某个特定的类创建仅有一个可访问的实例。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="nx"&gt;php&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Mysql&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="sd"&gt;/**&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; *&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; * @var self[该属性用来保存实例]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nv"&gt;$instance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="sd"&gt;/**&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; *&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; * @var mixed&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;15&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nv"&gt;$mix&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;16&lt;/span&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;17&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="sd"&gt;/**&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;18&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; * Return self instance[创建一个用来实例化对象的方法]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;19&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; *&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;20&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; * @return self&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;21&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;22&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;23&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;24&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nv"&gt;$instance&lt;/span&gt; &lt;span class="nx"&gt;instanceof&lt;/span&gt; &lt;span class="nx"&gt;self&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;25&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nv"&gt;$instance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;self&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;26&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;27&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nv"&gt;$instance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;28&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;29&lt;/span&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;30&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="sd"&gt;/**&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;31&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; * 构造函数为private,防止创建对象&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;32&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;33&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="fm"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;34&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;35&lt;/span&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;36&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="sd"&gt;/**&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;37&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; * 防止对象被复制&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;38&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;39&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="fm"&gt;__clone&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;40&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;41&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;trigger_error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Clone is not allowed !&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;42&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;43&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;44&lt;/span&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;45&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// @test&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;46&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$firstMysql&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Mysql&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="na"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;47&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$secondMysql&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Mysql&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="na"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;48&lt;/span&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;49&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$firstMysql&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;mix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ityangs_one&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;50&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$secondMysql&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;mix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ityangs_two&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;51&lt;/span&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;52&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;print_r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$firstMysql&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;mix&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;53&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 输出： ityangs_two&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;54&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;print_r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$secondMysql&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;mix&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-factory工厂模式"&gt;2. Factory(工厂模式)&lt;/h3&gt;&#10;&lt;p&gt;工厂模式是另一种非常常用的模式，正如其名字所示：确实是对象实例的生产工厂。某些意义上，工厂模式提供了通用的方法有助于我们去获取对象，而不需要关心其具体的内在的实现。&lt;/p&gt;</description></item></channel></rss>