工厂方法模式 //因为工厂类只包含方法,不包含成员变量,完全可以复用, // 不需要每次都创建新的工厂类对象,所以,简单工厂模式的第二种实现思路更加合适。 而使用简单工厂模式,将所有的创建逻辑都放到一个工厂类中,会导致这个工厂类变得很复杂。 抽象工厂工厂模式的使用场景: 当每个对象的创建逻辑都比较简单的时候,我推荐使用简单工厂模式,将多个对象的创建逻辑放到一个工厂类中。 工厂模式的作用: 封装变化:创建逻辑有可能变化,封装成工厂类之后,创建逻辑的变更对调用者透明。 代码复用:创建代码抽离到独立的工厂类之后可以复用。 当每个对象的创建逻辑都比较简单的时候,将多个对象的创建逻辑放到一个工厂类中。 实现: a. if else 创建不同的对象。 b. 用单例模式 + 简单工厂模式结合来实现。
设计模式-创建型 本章主要介绍有关对象创建的几种设计模式。 工厂模式 工厂模式:封装了对象的创建,使得获得对象更加符合实际逻辑 简单工厂 将所有对象的生产集中到一个工厂中 根据传参确定生产的对象类型 public abstract class Fruit { 建造者模式 有很多的框架都为我们提供了形如XXXBuilder的类型,一般可以使用这些类来创建我们需要的对象。 相比直接去new一个新的对象,建造者模式的重心更加关注在如何完成每一步的配置,如果一个类的构造方法参数过多,通过建造者模式来创建这个对象,会更加优雅。 原型模式实际上与对象的拷贝息息相关,原型模式使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象 **浅拷贝:**对于类中基本数据类型,会直接复制值给拷贝对象;对于引用类型,只会复制对象的地址
今天学习分享的是工厂模式: 工厂模式 Factory 将创建对象移交给工厂来处理。 : javax.crypto.Cipher#getInstance(String transformation); ---- 工厂方法 Factory Method 介绍 工厂方法是一种创建型设计模式 如果你希望复用现有对象来节省系统资源,而不是每次都重新创建对象,可使用工厂方法。 实现方式 工厂方法模式建议使用特殊的工厂方法代替对于对象构造函数的直接调用。 } throw new IllegalStateException("Unreachable code"); } ---- 抽象工厂 Abstract Factory 介绍 抽象工厂是一种创建型设计模式 一个工厂类只负责某个类对象或者某一组相关类对象的创建,而 DI 容器负责的是整个应用中所有类对象的创建。 DI 容器底层最基本的设计思路就是基于工厂模式的。
创建型设计模式 争对对象/类创建时的优化 工厂方法模式(了解) 通过定义顶层抽象工厂类,通过继承的方式,针对于每一个产品都提供一个工厂类用于创建。 情况:只适用于简单对象,当我们需要生产许多个产品族的时候,这种模式就有点乏力了 创建对象不再使用传统的new,而是创建一个工厂类,作为all实体类创建对象的一个封装类。 System.out.println(fruit); } } 工厂方法模式:通过范型灵活实现 如果新增了水果类型,直接创建一个新的工厂类就行,不需要修改之前已经编写好的内容。 多例模式:在计算机进程中,对一个实体类创建一次对象就是对当个对象操作,若是创建多个对象则是分别对对应的对象操作。 单例模式的三种写法: 原型模式 定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
单例模式、原型模式、工程模式、建造者模式,它们是以创建对象为目的的设计模式,它们也被称为创建型构建模式。 其中工厂模式、建造者模式之前已经介绍过,可以查看往期内容: 工厂模式 Factory Pattern 、 建造者模式 Builder Pattern ---- 单例模式 Singleton Pattern Singleton Pattern 是 Java 中最简单的设计模式,它提供了自己创建自己唯一实例的能力。 虽然运行结果都是同一对象实例,但是演示案例并不是一个优秀的单例模式。JDK 1.5 版本以后,单例模式的使用首推枚举类,枚举类简单易用,还满足多线程安全。 ---- 总结 将对象的创建与使用分离,使用者不需要了解对象创建的内部逻辑。通过这样的设计模式,来实现系统内部的解耦。
建造者模式的使用场景: 当被创建的对象内部成员之间相互依赖时,不能单纯的直接new出来; 当初始化参数比较多时,直接new出来,构造方法内的参数过多,代码不够简洁,容易出错; 直接new出来对象,再采用 如果需要一次性创建相互有依赖关系的多个对象时,就应该使用建造者模式。工厂模式跟建造者模式的区别:工厂方法是创建同一种类针对的很多,而 Builder 模式创建的是一个对象,只针对一个。 工厂模式是用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。 建造者模式是用来创建一种类型的复杂对象,通过设置不同的可选参数,“定制化”地创建不同的对象。网上有一个经典的例子很好地解释了两者的区别。 顾客走进一家餐馆点餐,我们利用工厂模式,根据用户不同的选择,来制作不同的食物,比如披萨、汉堡、沙拉。
在本文中,我们将探讨创建设计模式及其类型。 我们还将查看一些代码示例并讨论这些模式适合我们设计的情况。 创建型设计模式 创建型设计模式关注对象的创建方式。 创建设计模式通过将客户端与实际初始化过程完全分离来解决这个问题。 在本文中,我们将讨论四种创建型设计模式: 单例 – 确保在整个应用程序中最多只存在一个对象实例 工厂方法——创建几个相关类的对象,而不指定要创建的确切对象 抽象工厂——创建相关依赖对象的族 换句话说,这个模型允许我们创建遵循一般模式的对象。 Builder设计模式 Builder 设计模式是另一种创建模式,旨在处理相对复杂的对象的构造。
原型模式的两种实现方式:深拷贝和浅拷贝原型模式的原理与应用如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝 )的方式来创建新对象,以达到节省创建时间的目的。 这种基于原型来创建对象的方式就叫作原型设计模式(Prototype Design Pattern),简称原型模式。原型模式的两种实现方法原型模式有两种实现方法,深拷贝和浅拷贝。 浅拷贝:浅拷贝的实质定义:只拷贝基本数据类型和引用类型的地址,不拷贝引用对象本身,不会在堆内存中重新创建对象。Object 类的 clone() 方法执行的是浅拷贝。 浅拷贝和深拷贝:关键看引用的物理地址有没有发生变化,如果没有变化则是浅拷贝,发生变化就是深拷贝,也就是看这个拷贝有没有在堆中创建出来对象,没有创建新的对象,只是创建了一个对象引用则是浅拷贝,如果在堆中创建出了新的对象
在本文中,我们将探讨创建设计模式及其类型。 我们还将查看一些代码示例并讨论这些模式适合我们设计的情况。 创建型设计模式 创建型设计模式关注对象的创建方式。 创建设计模式通过将客户端与实际初始化过程完全分离来解决这个问题。 在本文中,我们将讨论四种创建型设计模式: 单例 - 确保在整个应用程序中最多只存在一个对象实例 工厂方法——创建几个相关类的对象,而不指定要创建的确切对象 抽象工厂——创建相关依赖对象的族 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
模式定义 简单工厂模式又称静态工厂模式。可以根据参数的不同返回不同类的实例。定义一个类来创建其它类的实例。 模式角色 简单工厂模式包含如下角色 Factory:工厂角色 Product:抽象产品角色 ConcreteProduct:具体产品角色 ? public class Factory{ public static Produce methodA(){ return new ConcreteProduct();//创建具体产品 }; } 场景应用 简单工厂模式在jdk有不少应用,比如 java.text.DateFormat public final static DateFormat getDateInstance : 工厂类负责创建的对象比较少;客户端只知道传入工厂类的参数,对象创建过程不会影响客户端代码 优缺点 优点:简单工厂模式将对象创建和本身业务处理分开,降低了耦合 缺点:工厂类集中了所有产品创建逻辑,一旦新增产品就得修改工厂类
我心想,500 个对象字面量,要死要死,还好有构造函数,于是写出了一个可以自动创建用户的 User 函数: function User(name, age, career) { this.name 在 JavaScript 中,我们使用构造函数去初始化对象,就是应用了构造器模式。 这里引出一个问题: 在创建一个 user 过程中,谁变了,谁不变? 2、简单工厂模式 这里用个例子来介绍一下简单工厂模式: 老板还想要这个系统具备给不同工种分配职责说明的功能。 现在我们一起来总结一下什么是工厂模式: 工厂模式其实就是将创建对象的过程单独封装。 3、小结 工厂模式的简单之处,在于它的概念相对好理解:将创建对象的过程单独封装,这样的操作就是工厂模式。
模式定义 原型模式(Prototype Pattern):原型模式是提供一个原型接口,提供原型的克隆,创建新的对象,是一种对象创建型模式。 模式结构 原型模式包括如下角色 Prototype :抽象原型类 ConcretePrototype:具体原型类 Client:客户类 原型模式类别 一个类包括另外一个成员变量,在使用原型模式进行对象克隆时 、接收者、标题、内容、日期、附件等),某系统中现需要提供一个邮件复制功能,对于已经创建好的邮件对象,可以通过复制的方式创建一个新的邮件对象,如果需要改变某部分内容,无须修改原始的邮件对象,只需要修改复制后得到的邮件对象即可 原型模式适用的场景 保存对象的状态:对于要保存的状态不是很占内存的情况,可以适用原型模式和备忘录模式保存对象状态,如果对象占用太多内存,那就还是状态模式比较好 创建新对象成本很大的情况:比如创建一个对象是需要查询很慢的 SQL才能给对象赋值,这种情况就和适合用原型模式克隆对象,减少对象创建和查询 原型模式应用的场景 对于很多软件的复制和粘贴实现其实也是原型模式的应用 Spring框架提供BeanUtils.copyProperties