# designPatterns **Repository Path**: JXHuang_admin/design-patterns ## Basic Information - **Project Name**: designPatterns - **Description**: 设计模式 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-03-12 - **Last Updated**: 2024-03-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 设计模式 1. 创建型 - 抽象工厂 > 创建一系列相关或依赖的对象而不指定它们的具体类。通常创建的类都实现相同的接口。抽象工厂的客户端并不关心这些对象是如何创建的,它只知道它们如何组合在一起。 - 兼容不同系统,并且输出格式为json和Csv。 - 建设者 > Builder 是构建复杂对象的各个部分的接口。 有时,如果构建者对其构建的内容有更好的了解,则该接口可以是具有默认方法的抽象类(也称为适配器)。 如果您有一个复杂的对象继承树,那么也有一个复杂的构建器继承树是合乎逻辑的。 注意:构建器通常具有流畅的界面,例如,请参阅 PHPUnit 的模拟构建器。 - 生产车子,有两种不同的车,但是车的构造相同,有轮子,门,引擎等,建造的执行顺序是一致的。 - 工厂方法 > SimpleFactory 的优点是您可以将其子类化以实现创建对象的不同方法。 对于简单的情况,这个抽象类可以只是一个接口。 该模式是“真正的”设计模式,因为它实现了依赖倒置原则,又称为 SOLID 原则中的“D”。 这意味着 FactoryMethod 类依赖于抽象,而不是具体的类。与 SimpleFactory 或 StaticFactory 相比,这才是真正的技巧。 - 池 > 对象池模式是一种软件创建设计模式,它使用一组随时可用的初始化对象(“池”),而不是按需分配和销毁它们。池的客户端将从池中请求对象并对返回的对象执行操作。当客户端完成后,它会将对象(一种特定类型的工厂对象)返回到池中,而不是销毁它。 在初始化类实例的成本较高、类的实例化率较高且任一时间使用的实例数量较低的情况下,对象池可以提供显着的性能提升。当新对象的创建(尤其是通过网络)可能需要可变的时间时,池化对象是在可预测的时间内获得的。 然而,这些好处对于时间成本较高的对象来说大多是正确的,例如数据库连接、套接字连接、线程和大型图形对象(例如字体或位图)。在某些情况下,简单的对象池(不持有外部资源,仅占用内存)可能效率不高,并且可能会降低性能。 - 原型 > 避免以标准方式(new Foo())创建对象的成本,而是创建一个原型(prototype)并克隆它。 - 大量数据(例如:通过 ORM 在数据库中创建百万行数据。)克隆书本 - 简单工厂 > SimpleFactory 是一个简单的工厂模式。 它不同于静态工厂,因为它不是静态的。因此,您可以拥有多个工厂,可以有不同的参数,可以进行子类化,也可以模拟。它总是比静态工厂更受欢迎。 - 生产汽车的工厂 - 单例模式 > 注:单例模式可能被认为是一种“反模式”。为了获得更好的可测试性和可维护性,建议使用依赖注入。让应用只存在一个对象的实例,处理所有的调用。数据库连接器 日志记录器 Config Manager Threads Handling 应用程序的锁定文件(Lock file,理论上整个应用应该只有一个锁文件) - 静态工厂 > 与 抽象工厂 类似,静态工厂模式用于创建一系列互相关联或依赖的对象。它与抽象工厂模式的区别在于,静态工厂模式仅使用 一个静态方法 来创建所有它可以创建的类型。通常,这个静态方法被命名为:factory 或 build。 2. 结构 - 适配器 > 将某个类的接口转换成与另一个接口兼容。适配器通过将原始接口进行转换,给用户提供一个兼容接口,使得原来因为接口不同而无法一起使用的类可以得到兼容。 - 数据库客户端库适配器。使用不同的webservices ,通过适配器来标准化输出数据,从而保证不同webservice输出的数据是一致的 - 桥接 > 解耦一个对象的实现与抽象,这样两者可以独立地变化。 - 组合 > 以单个对象的方式来对待一组对象.form类的实例包含多个子元素,而它也像单个子元素那样响应render()请求,当调用 render() 方法时,它会历遍所有的子元素,调用 render() 方法 - 数据映射器 >数据映射器是一个数据访问层,用于将数据在持久性数据存储(通常是一个关系数据库)和内存中的数据表示(领域层)之间进行相互转换。其目的是为了将数据的内存表示、持久存储、数据访问进行分离。该层由一个或者多个映射器组成(或者数据访问对象),并且进行数据的转换。映射器的实现在范围上有所不同。通用映射器将处理许多不同领域的实体类型,而专用映射器将处理一个或几个。 此模式的主要特点是,与Active Record不同,其数据模式遵循单一职责原则(Single Responsibility Principle)。 - DB Object Relational Mapper (ORM) : Doctrine2 使用 DAO “EntityRepository” 作为DAO - 装饰器 > 动态地为类的实例添加功能 - Web Service层:REST服务的JSON与XML装饰器(当然,在此只能使用其中的一种) - 依赖注入 > 实现了松耦合的软件架构,可得到更好的测试,管理和扩展的代码。通过配置需要注入的依赖,Connection 能从 $config 中获取到所有它需要的依赖。如果没有依赖注入,Connection 会直接创建它需要的依赖,这样不利于测试和扩展 Connection。 - Doctrine2 ORM 使用了依赖注入,它通过配置注入了 Connection 对象。为了达到方便测试的目的,可以很容易的通过配置创建一个mock的 Connection 对象。 - 外观模式 > 外观模式的目的不是为了让你避免阅读烦人的API文档(当然,它有这样的作用),它的主要目的是为了减少耦合并且遵循得墨忒耳定律(Law of Demeter) Facade通过嵌入多个(当然,有时只有一个)接口来解耦访客与子系统,当然也降低复杂度。 Facade 不会禁止你访问子系统 你可以(应该)为一个子系统提供多个 Facade 因此一个好的 Facade 里面不会有 new 。如果每个方法里都要构造多个对象,那么它就不是 Facade,而是生成器或者[抽象|静态|简单] 工厂 [方法]。 优秀的 Facade 不会有 new,并且构造函数参数是接口类型的。如果你需要创建一个新实例,则在参数中传入一个工厂对象。 - 连贯接口 > 用来编写易于阅读的代码,就像自然语言一样(如英语) - Doctrine2 的 QueryBuilder,就像下面例子中类似 - PHPUnit 使用连贯接口来创建 mock 对象 - FlyWeight > 为了最大限度地减少内存使用,Flyweight与类似的对象共享尽可能多的内存。当使用大量状态差异不大的对象时,需要使用它。一种常见的做法是将状态保存在外部数据结构中,并在需要时将其传递给轻量级对象。 - 扫描关键词 - 多重循环,查找匹配 - 代理模式 > 为昂贵或者无法复制的资源提供接口。 - Doctrine2 使用代理来实现框架特性(如延迟初始化),同时用户还是使用自己的实体类并且不会使用或者接触到代理 - 注册模式 > 为应用中常用的对象实现一个中央存储,通常用一个只有静态方法的抽象类来实现(或者使用单例模式) - provider 3. 行为 - 责任链模式 > 创建一个按顺序处理调用的对象链。如果一个对象不能处理调用,它将把调用委托给链中的下一个对象,以此类推。 - 日志框架,其中每个链元素自主决定如何处理日志信息 - 垃圾邮件过滤器 - 缓存:第一个对象是一个例如Memcached的接口,如果“没有命中”它则委托调用数据库的接口 - 命令行模式 > - 解析器模式 - 迭代器模式 - 中介者模式 - 备忘录模式 - 空对象模式 - 观察者模式 - 规格模式 - 状态模式 - 策略模式 - 模板方法模式 - 访问者模式 4. 其他 - Service locator - Repository - Entity-Attribute-Value(EAV) 共:35种设计模式 ## 单元测试 基本测试,需要下载phpunit.phar或者composer安装phpunit 代码覆盖率测试,需要安装xdebug,并且compose安装`phpunit/php-code-coverage`。 ## 代码重构 快捷键三建+t --- 设计模式文档:https://designpatternsphp.readthedocs.io/en/latest/Creational/Pool/README.html phpunit: https://docs.phpunit.de/en/9.6/writing-tests-for-phpunit.html#data-providers 测试使用示例:https://blog.csdn.net/junjiahuang/article/details/136626614?spm=1001.2014.3001.5502