工厂方法模式(Factory Method Pattern)属于创建型模式,定义一个创建对象的接口函数,但由子类决定实例化某一个类,让工厂类把实例化推迟到子类。 在前面的设计模式(四)——简单工厂模式中我们介绍了简单工厂模式,接下来将介绍下工厂方法模式,它同样是创建型设计模式,有相似之处,但又有些不同,文章的末尾会介绍他们之间的不同。 每一个子类工厂,负责创建一个具体产品类的对象。 2.工厂方法模式具体应用 请参考设计模式(四)——简单工厂模式这篇文章。 还是以生产比萨为例,比萨店需要根据客户订单,生产不同口味的比萨。 工厂方法模式: 提供创建对象的接口,让子类去决定具体实例化的对象,把简单的内部逻辑判断移到了客户端代码。工厂方法克服了简单工厂违背开放封闭原则的缺点,又保持了封装对象创建过程的优点。 下一篇将讲解抽象工厂模式,并与二者进行对比。 4.小结 (1)工厂方法模式属于创建型模式,定义一个创建对象的接口函数,但由子类决定实例化某一个类,让工厂类把实例化推迟到子类。
工厂方法模式 //因为工厂类只包含方法,不包含成员变量,完全可以复用, // 不需要每次都创建新的工厂类对象,所以,简单工厂模式的第二种实现思路更加合适。 而使用简单工厂模式,将所有的创建逻辑都放到一个工厂类中,会导致这个工厂类变得很复杂。 抽象工厂工厂模式的使用场景: 当每个对象的创建逻辑都比较简单的时候,我推荐使用简单工厂模式,将多个对象的创建逻辑放到一个工厂类中。 工厂模式的作用: 封装变化:创建逻辑有可能变化,封装成工厂类之后,创建逻辑的变更对调用者透明。 代码复用:创建代码抽离到独立的工厂类之后可以复用。 当每个对象的创建逻辑都比较简单的时候,将多个对象的创建逻辑放到一个工厂类中。 实现: a. if else 创建不同的对象。 b. 用单例模式 + 简单工厂模式结合来实现。
设计模式-创建型 本章主要介绍有关对象创建的几种设计模式。 工厂模式 工厂模式:封装了对象的创建,使得获得对象更加符合实际逻辑 简单工厂 将所有对象的生产集中到一个工厂中 根据传参确定生产的对象类型 public abstract class Fruit { 建造者模式 有很多的框架都为我们提供了形如XXXBuilder的类型,一般可以使用这些类来创建我们需要的对象。 相比直接去new一个新的对象,建造者模式的重心更加关注在如何完成每一步的配置,如果一个类的构造方法参数过多,通过建造者模式来创建这个对象,会更加优雅。 原型模式实际上与对象的拷贝息息相关,原型模式使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象 **浅拷贝:**对于类中基本数据类型,会直接复制值给拷贝对象;对于引用类型,只会复制对象的地址
创建型设计模式 争对对象/类创建时的优化 工厂方法模式(了解) 通过定义顶层抽象工厂类,通过继承的方式,针对于每一个产品都提供一个工厂类用于创建。 情况:只适用于简单对象,当我们需要生产许多个产品族的时候,这种模式就有点乏力了 创建对象不再使用传统的new,而是创建一个工厂类,作为all实体类创建对象的一个封装类。 System.out.println(fruit); } } 工厂方法模式:通过范型灵活实现 如果新增了水果类型,直接创建一个新的工厂类就行,不需要修改之前已经编写好的内容。 多例模式:在计算机进程中,对一个实体类创建一次对象就是对当个对象操作,若是创建多个对象则是分别对对应的对象操作。 单例模式的三种写法: 原型模式 定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
今天学习分享的是工厂模式: 工厂模式 Factory 将创建对象移交给工厂来处理。 : javax.crypto.Cipher#getInstance(String transformation); ---- 工厂方法 Factory Method 介绍 工厂方法是一种创建型设计模式 如果你希望复用现有对象来节省系统资源,而不是每次都重新创建对象,可使用工厂方法。 实现方式 工厂方法模式建议使用特殊的工厂方法代替对于对象构造函数的直接调用。 } throw new IllegalStateException("Unreachable code"); } ---- 抽象工厂 Abstract Factory 介绍 抽象工厂是一种创建型设计模式 一个工厂类只负责某个类对象或者某一组相关类对象的创建,而 DI 容器负责的是整个应用中所有类对象的创建。 DI 容器底层最基本的设计思路就是基于工厂模式的。
(Abstract Factory) 1.1、抽象工厂模式概述 抽象工厂模式(Abstract Factory)也属于创建型设计模式,用于创建系列产品。 三、单例模式(Singleton) 3.1、单例模式概述 单例模式(Singleton)属于创建型设计模式,用于创建整个程序中只允许存在一个实例的类的对象。 4.1、建造者模式概述 建造者模式(Builder)属于创建型设计模式,同样用于创建复杂对象。 五、原型模式(Prototype) 5.1、原型模式概述 原型模式(Builder)属于创建型设计模式,是我的《GoF设计模式》系列文章中介绍的最后一个创建型模式。 5.2、原理分析 原型模式虽然是创建型的模式,但是与工程模式没有关系,从名字即可看出,该模式的思想就是将一个对象作为原型, 对其进行复制、克隆,产生一个和原对象类似的新对象。
建造者模式的使用场景: 当被创建的对象内部成员之间相互依赖时,不能单纯的直接new出来; 当初始化参数比较多时,直接new出来,构造方法内的参数过多,代码不够简洁,容易出错; 直接new出来对象,再采用 如果需要一次性创建相互有依赖关系的多个对象时,就应该使用建造者模式。工厂模式跟建造者模式的区别:工厂方法是创建同一种类针对的很多,而 Builder 模式创建的是一个对象,只针对一个。 工厂模式是用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。 建造者模式是用来创建一种类型的复杂对象,通过设置不同的可选参数,“定制化”地创建不同的对象。网上有一个经典的例子很好地解释了两者的区别。 顾客走进一家餐馆点餐,我们利用工厂模式,根据用户不同的选择,来制作不同的食物,比如披萨、汉堡、沙拉。
单例模式、原型模式、工程模式、建造者模式,它们是以创建对象为目的的设计模式,它们也被称为创建型构建模式。 其中工厂模式、建造者模式之前已经介绍过,可以查看往期内容: 工厂模式 Factory Pattern 、 建造者模式 Builder Pattern ---- 单例模式 Singleton Pattern Singleton Pattern 是 Java 中最简单的设计模式,它提供了自己创建自己唯一实例的能力。 虽然运行结果都是同一对象实例,但是演示案例并不是一个优秀的单例模式。JDK 1.5 版本以后,单例模式的使用首推枚举类,枚举类简单易用,还满足多线程安全。 ---- 总结 将对象的创建与使用分离,使用者不需要了解对象创建的内部逻辑。通过这样的设计模式,来实现系统内部的解耦。
原型模式的两种实现方式:深拷贝和浅拷贝原型模式的原理与应用如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝 )的方式来创建新对象,以达到节省创建时间的目的。 这种基于原型来创建对象的方式就叫作原型设计模式(Prototype Design Pattern),简称原型模式。原型模式的两种实现方法原型模式有两种实现方法,深拷贝和浅拷贝。 浅拷贝:浅拷贝的实质定义:只拷贝基本数据类型和引用类型的地址,不拷贝引用对象本身,不会在堆内存中重新创建对象。Object 类的 clone() 方法执行的是浅拷贝。 浅拷贝和深拷贝:关键看引用的物理地址有没有发生变化,如果没有变化则是浅拷贝,发生变化就是深拷贝,也就是看这个拷贝有没有在堆中创建出来对象,没有创建新的对象,只是创建了一个对象引用则是浅拷贝,如果在堆中创建出了新的对象
在本文中,我们将探讨创建设计模式及其类型。 我们还将查看一些代码示例并讨论这些模式适合我们设计的情况。 创建型设计模式 创建型设计模式关注对象的创建方式。 在本文中,我们将讨论四种创建型设计模式: 单例 – 确保在整个应用程序中最多只存在一个对象实例 工厂方法——创建几个相关类的对象,而不指定要创建的确切对象 抽象工厂——创建相关依赖对象的族 换句话说,这个模型允许我们创建遵循一般模式的对象。 Builder设计模式 Builder 设计模式是另一种创建模式,旨在处理相对复杂的对象的构造。 本文为从大数据到人工智能博主「xiaozhch5」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
对之前来讲可能是对其中部分设计模式还是相对来说熟悉的但仔细琢磨还是会有些疑问,正好在目前相对来说有更多的业余时间,可以来一次重新学习设计模式! 本篇内容关于原型模式。包含原型模式的设计与实现。 定义 原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的“原型”,这个原型是可定制的。 ——维基百科 原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。 避免手动去创建相同内容的对象因为第一复杂繁琐效率不高,第二在外面真不一定能创建一模一样的对象很多属性是私有的且没有公开方法方法。 对于一个马里奥怪物类,我们可以去手动创建蘑菇人对象,也可以创建乌龟对象。但我们再创建一个蘑菇人或者一百个就是通过原型模式的方法。只有定制化创建时去手动设计,之后再需要一模一样的对象就通过原型方法获取。
在本文中,我们将探讨创建设计模式及其类型。 我们还将查看一些代码示例并讨论这些模式适合我们设计的情况。 创建型设计模式 创建型设计模式关注对象的创建方式。 创建设计模式通过将客户端与实际初始化过程完全分离来解决这个问题。 在本文中,我们将讨论四种创建型设计模式: 单例 - 确保在整个应用程序中最多只存在一个对象实例 工厂方法——创建几个相关类的对象,而不指定要创建的确切对象 抽象工厂——创建相关依赖对象的族 Builder 换句话说,这个模型允许我们创建遵循一般模式的对象。 Builder设计模式 Builder 设计模式是另一种创建模式,旨在处理相对复杂的对象的构造。
使应用中只存在一个对象的实例,并且使这个单实例负责所有对该对象的调用 final class Singleton{ private static ?Singleton $instance =
建造者模式(Builder) 建造者模式(Builder) 介绍 建造者模式(又叫生成器/构建者模式) 建造者模式是一种创建型设计模式, 使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。 适用场景 避免重叠构造函数(telescopic constructor) 创建不同形式的产品或分步骤构造产品 类属性有依赖或约束关系时(如单个set无法满足多个值的校验) 创建不可变对象(构建前赋值 即创建方法) 优缺点 优点: 可以分步创建 或延缓创建 或递归创建 生成不同形式的产品时可以复用代码 单一职责 缺点: 需要新增类,复杂度增加 与其他模式的关系 工厂模式是用来创建不同但是相关的对象, 建造者模式是用来创建一种类型的复杂对象 示例 public class ConstructorArg { /** * 当 isRef 为 true 的时候,arg 表示 String
当使用对象后,不是立即销毁对象,而是放回池子闲的数组里面,下次使用直接拿,拿到后放到忙的数组里.当拿不到的时候就再创建新 class WorkerPool { /** * @var 忙的数组
原型模式(Prototype) 原型模式(Prototype) 介绍 原型模式是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类。 如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同), 在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式来创建新对象,以达到节省创建时间的目的。 子类直接的区别仅在于其初始化的方式时,可以用该模式减少子类的数量(别人创建这些子类的目的可能是为了创建特定类型的对象)。 ... 实现方式 原型类必须添加一个以该类对象为参数的构造函数。 与其他模式的关系 在许多设计工作的初期都会使用工厂方法模式(较为简单,而且可以更方便地通过子类进行定制),随后演化为使用抽象工厂模式、原型模式或生成器模式(更灵活但更加复杂)。 也减少了创建对象时的成本。
通过创建一个原型对象,然后复制原型对象来避免通过标准的方式创建大量的对象产生的开销(new Foo())。 大量的数据对象(比如通过ORM获取1,000,000行数据库记录然后创建每一条记录对应的对象实体) 带构造方法、属性的类,clone的性能要比new带上构造参数的性能高不少 这个就是原型,子类继承这个原型来搞 ,就是原型模式 abstract class BookPrototype { protected string $title; protected string $category; BookPrototype { protected string $category = 'Bar'; public function __clone() { } } 比如有循环创建对象的情况
和抽象工厂类似,静态工厂模式用来创建一系列互相关联或依赖的对象 和抽象工厂模式不同的是静态工厂模式只用一个静态方法就解决了所有类型的对象创建 工厂里提供一个静态方法来创建不同的对象实例 final class
简单的创建对象型工厂模式,目的是当有很多的初始化动作的时候,可以直接在工厂里搞,不用每次new都写一遍 工厂生成自行车 class SimpleFactory { public function
设计模式 创建型的设计模式主要有: 设计模式 - 创建型 其中的原型模式比较少用到。 今天分享的是单例模式。 介绍 单例模式(Singleton Design Pattern): 一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。 该函数调用私有构造函数来创建对象, 并将其保存在一个静态成员变量中。此后所有对于该函数的调用都将返回这一缓存对象。 private static HungrySingleton instance = new HungrySingleton(); /** * 必须为 private 防止不小心使用 new 关键字创建 ,当调用 getInstance() 时才会创建 instance * 相当于让 JVM 来确保 instance 的线程安全与唯一性 */ private static class