# java设计模式 **Repository Path**: aaaaaaasssdddaa/design-patterns ## Basic Information - **Project Name**: java设计模式 - **Description**: 23种设计模式,java语言实现 - **Primary Language**: Java - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-06-16 - **Last Updated**: 2023-08-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: 设计模式, Java ## README ## 工厂方法 ### 概念 #### 简单工厂模式 ​ 简单工厂模式(Simple Factory Pattern )是指由一个工厂对象决定创建出哪一种产品类的实例但它不属于 GOF23 种设计模式。简单工厂适用于工厂类负责创建的对象较少的场景,且客户端只需要传入工厂类的参数,对于如何创建对象的逻辑不需要关心。 #### 工厂方法模式 ​ 工厂方法模式( Fatory Method Pattern ) 是指定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。在工厂方法模式中用户只需要关心所需产品对应的工厂,无须关心创建细节,而且加入新的产品符合开闭原则 ​ 工厂方法模式主要解决产品扩展的问题,在简单工厂中,随着产品链的丰富,如果每个课程的创建逻辑有区别的话,工厂的职责会变得越来越多,有点像万能工厂,并不便于维护。根据单一职责原则我们将职能继续拆分,专人千专事。Java 课程由 Java 工厂创建,Pvthon 课程由 Pthon工厂创建,对工厂本身也做一个抽象。来看代码,先创建ICourseFactory 接口 #### 抽象工厂模式 ​ 抽象工厂模式(Abastract Factory Pattern )是指提供一个创建一系列相关或相互依赖对象的接口无须指定他们具体的类。客户端( 应用层)不依赖于产品类实例如何被创建、实现等细节,强调的是一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码。需要提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。 #### 抽象工厂模式的缺点: ​ 抽象工厂模式的最大缺点就是产品族扩展非常困难,为什么这么说呢?我们以通用代码为例,如果要增加一个产品C,也就是说产品家族由原来的2个增加到3个,看看我们的程序有多大改动吧!抽象类AbstractCreator要增加一个方法reateProductC(),然后两个实现类都要修改,想想看,这严重违反了开闭原则,而且我们一直说明抽象类和接口是一个契约。改变契约,所有与契约有关系的代码都要修改,那么这段代码叫什么?叫“有毒代码”,——只要与这段代码有关系,就可能产生侵害的危险! ### 工厂方法模式与抽象工厂模式的区别: ​ 区别在于产品,如果产品单一,最合适用工厂模式,但是如果有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。再通俗深化理解下:工厂模式针对的是一个产品等级结构 ,抽象工厂模式针对的是面向多个产品等级结构的。 ### 工厂方法模式与抽象工厂模式对比: | **工厂方法模式** | **抽象工厂模式** | | ---------------------------------------------- | ---------------------------------------------- | | **针对的是一个产品等级结构** | **针对的是面向多个产品等级结构** | | **一个抽象产品类** | **多个抽象产品类** | | **可以派生出多个具体产品类** | **每个抽象产品类可以派生出多个具体产品类** | | **一个抽象工厂类,可以派生出多个具体工厂类** | **一个抽象工厂类,可以派生出多个具体工厂类** | | **每个具体工厂类只能创建一个具体产品类的实例** | **每个具体工厂类可以创建多个具体产品类的实例** | ## 原型模式 ### 优点: 1、性能优良,Java 自带的 原型模式 是基于内存二进制流的拷贝,比直接 ew 一个对象性能上提升了许多。 2、可以使用深克隆方式保存对象的状态,使用原型模式将对象复制一份并将其状态保存起来,简化了创建对象的过程,以便在需要的时候使用(例如恢复到历史某一状态),可辅助实现撤销操作 ### 缺点: 1、需要为每一个类配置一个克隆方法 2、克隆方法位于类的内部,当对已有类进行改造的时候,需要修改代码,违反了开闭原则。 3、在实现深克隆时需要编写较为复杂的代码,而且当对象之间存在多重嵌套引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来会比较麻烦。因此,深拷贝、浅拷贝需要运用得