当然是有的,接下来来引入静态工厂方法 先来看下面这个代码: @Data public class Animal{ private Integer age; private Integer weight 当然这只是抛砖引玉,只阐述了静态工厂方法的一个优点,看过《高效java》的读者都知道开篇就是说“ 1、考虑使用静态工厂方法替代构造方法 ” (滑稽一下:用大字表示对文章的引用),同时也阐述了具体的优点 其实静态工厂方法也不是什么神秘的技术,它更多地是一种思想,一种模式,一种治理手段,像是Integer.valueOf(1),String.valueOf(),都是静态工厂方法的典型案例,深刻理解并将其运用到实际的项目中去 借用《Effective Java》中的话: 简而言之,静态工厂方法和公有构造器都各有用处,我们需要理解它们各自的长处 静态工厂经常更 合适,因 切忌第一反应就是提供公有的构造器, 不先考虑静态工厂 这样我们离架构师又近了一步 附录:针对java中有关静态工厂方法的一些通俗约定 1、from一一类型转换方法,它只有单个参数,返回该类型的一个相对应的实例, 2、of 聚合方法,带有多个参数,返回该类型的一个实例,把它们合并起来,
尽管这肯定是一种可行的方法,但是本周,让我们看一下编写不需要任何子类形式的设置代码的另一种方法——使用静态工厂方法(static factory methods)。 ? swift: 静态工厂方法 视图 Views 视图是我们在编写UI代码时必须设置的最常见对象之一。 相反,让我们尝试使用静态工厂方法来实现相同的目的。 对于那些视图控制器,将其设置移动到静态工厂API可能是一个很好的解决方案。 -使用静态工厂方法和属性的替代方法是使用实际工厂对象。
,即为我们所说的静态工厂方法(Static factory method)。 在实际的场景中,单例的写法也大都是用静态工厂方法来实现的。 除此之外 以上是《Effective Java》中总结的几条应该使用静态工厂方法代替构造器的原因,如果你看过之后仍然犹豫不决,那么我觉得可以再给你更多一些理由 —— 我个人在项目中是大量使用静态工厂方法的 ,从我的实际经验来说,除了上面总结的几条之外,静态工厂方法实际上还有更多的优势。 这时候,静态工厂方法就可以登场了。
* 本文原创作者:追影人,本文属FreeBuf原创奖励计划,未经许可禁止转载 前言 [逆向工厂]第一章节中介绍了逆向技术的相关基础知识,其中提到逆向的两种形式:静态分析、动态分析。 本章将对静态分析技术进行讲解,重点阐述静态分析的原理方法,程序的静态结构,常见流程控制语句的静态反编译形态,并且通过实例来掌握利用IDA逆向工具的静态逆向分析技术。 有关函数调用过程中的具体问题及所涉及的堆栈平衡知识,逆向工厂将在后续动态分析章节中详细介绍。 写在最后 本章逆向工厂重点讲述静态逆向分析技术,程序代码结构,常用的流程控制语句的反编译形态,并且结合IDA分析CM程序执行流程。 相关内容敬请关注逆向工厂,如果您有什么好的建议或意见,欢迎留言交流。 * 本文原创作者:追影人,本文属FreeBuf原创奖励计划,未经许可禁止转载
目录 工厂模式 单例模式 策略模式 适配器模式 观察者模式 工厂模式 工厂模式的原理 作用: 就是你只要传你需要的类进去,你就能得到他的实例化对象 其实工厂就是帮你实例化你所需要的类 <? php /** * 工厂类 */ class factory { public static function create($className) { return new $ b = factory::create('B'); var_dump($a); // object(A)#1 (0) {} var_dump($b); // object(B)#2 (0) {} 工厂模式的应用 单例模式的定义 单例模式的入门口诀是:三私一公 私有的构造方法: 防止人为外部使用 new 进行创建这就是上面普通内的实例化了 私有的克隆方法: 防止人为外部使用 clone 方法后进行实例化 私有的静态属性 : 用来存储单一的实例化对象 公有的静态方法: 用来实现单一的实例化逻辑 从结果来看﹕两个类的对象内存空间都指向了 #1,实现了单例模式的基础构建 <?
和抽象工厂类似,静态工厂模式用来创建一系列互相关联或依赖的对象 和抽象工厂模式不同的是静态工厂模式只用一个静态方法就解决了所有类型的对象创建 工厂里提供一个静态方法来创建不同的对象实例 final class } throw new InvalidArgumentException('Unknown format given'); } } 被生产的产品和前面的抽象工厂 /工厂方法 ,基本一样 先定义一个接口,不同的产品实现这一个接口
通过调用静态工厂方法创建Bean 调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中,当客户端需要对象时,只需要简单地调用静态方法,而不同关心创建对象的细节 要声明通过静态方法创建Bean, 需要在Bean的class属性里指定拥有该工厂的方法的类,同时在factory-method属性里指定工厂方法的名称,最后,使用<constrctor-arg>元素为该方法传递方法参数 // Car public -- 通过静态工厂方法来配置bean。注意不是配置静态工厂方法实例,而是配置bean实例--> <! -- factory-method:指向静态工厂方法的名字 --> <! 实例工厂方法:将对象的创建过程封装到另外一个对象实例的方法里,当客户端需要请求对象时,只需要简单的调用该实例方法而不需要关心对象创建细节 // StaticCarFactory public class
静态工厂增加需要是修改源代码,对修改不封闭,不符合开闭原则。 ---- Simple Factory 简单工厂模式(静态工厂) 1)Simple Factory模式属于创建型模式 2)简单工厂模式是由一个工厂(注意是一个!) 可以看出,客户端只面对工厂,不用管产品的具体细节,客户只需向工厂要求你需要什么,其他的事情都交给工厂了。 ---- 工厂方法模式 UML类图如下: ? 这个和简单工厂有区别,简单工厂模式只有一个工厂,工厂方法模式对每一个产品都有相应的工厂。 ② 一个抽象工厂类,可以派生出多个具体工厂类。 ③ 每个具体工厂类可以创建多个具体产品类的实例。 区别:① 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
设计模式之静态工厂模式 01前言 该系列模式已经更新五篇,希望大家可以多看看以前的模式,并且从今天开始我打算换一种讲解方式,我不在贴出运行结果了,希望大家可以自己动手敲一下代码,然后我会在下一篇中更新上一篇的运行结果 02模式定义 当有多个抽象角色时使用的一种工厂模式。 抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品对象。 它有多个抽象产品类,每个抽象产品类可以派生出多个具体产品类,一个抽象工厂类,可以派生出多个具体工厂类,每个具体工厂类可以创建多个具体产品类的实例。 03适用场景 1, 一个对象拥有很多子类。 抽象工厂接口 ? 工厂具体实现类A ? 工厂具体实现类B ? 手机产品抽象产品接口 ? 手机产品具体实现类A(仿照手机产品实现类A仿写一个实现类B) ? 电脑产品抽象产品接口 ?
《Effective Java》这本书的第一条建议就是考虑用静态工厂方法代替构造器。 于是从网上看了一些关于静态工厂方法的资料,下面来分享一下。 首先来看一下什么是静态工厂方法: 在 Java 中,获得一个类实例最简单的方法就是使用 new 关键字,通过构造函数来实现对象的创建。 Effective Java中静态工厂方法的特点: 1.静态工厂方法与构造器不同的第一大优势在于,他们有名称。 由于静态工厂方法有名称,所以他们不受上述限制,当一个类需要多个带有相同签名的构造器时,就用静态工厂方法代替构造器。 实际的场景中,单例的写法也大都是用静态工厂方法来实现的。 3.静态工厂方法与构造器不同的第三大优势在于,他们可以返回原类型的任何子类型的对象。
创建时间: 2016/11/9 8:37 作者: tjhuey@163.com 图图接下来将介绍第二种设计模式,工厂设计模式。工厂,见名知意,就是创建产品的。 同样在java中,是用来创建对象的。 为什么用工厂模式呢,因为他可以解耦,可扩展。方便开发。 而最常用的就是静态工厂模式,(很多时候会结合单例模式,new出来的对象是单例的) 简单的UML图(有瑕疵)如下 ? interface Computer { public void run(); } package org.huey.partten.factory.factorymethod; /* * 工厂接口
初步接触设计模式,初步了解静态工厂方法,了解还不全面,我们先一步步了解一下。 2.工厂模式大概有三种 简单工厂模式 工厂方法模式 抽象工厂模式 3.简单(静态)工厂模式 简单工厂模式是最初自然而然就有的设计思想,它只是把创建过程比较自然的封装了一下,又称为静态工厂模式 四、参考文章及更多介绍 由于我目前学到的有限,更多方面还不了解,不便说自己还不清楚的,但是下面的一些文章确实不错: 静态工厂模式 理解(有代码示例) Java静态工厂方法 —— 有了它,你还需要工厂模式吗 (有代码示例) 简单工厂(静态工厂)(有代码示例+图解) 简单(静态)工厂模式(有代码示例) 关于 Java 的静态工厂方法,看这一篇就够了! (有代码示例,静态工厂方法写的比较全面) java 设计模式 常用21种(通过代码解释了10种设计模式) 设计模式之泡MM真经(通俗易懂的解释了23种设计模式,很推荐!)
类可以为其客户端提供静态工厂方法,而不是公共构造方法。提供静态工厂方法而不是公共构造方法有优点也有缺点。 静态工厂方法的一个优点是,不像构造方法,它们是有名字的。 因为他们有名字,所以静态工厂方法不会受到上面讨论中的限制。在类中似乎需要具有相同签名的多个构造方法的情况下,用静态工厂方法替换构造方法,并仔细选择名称来突出它们的差异。 静态工厂方法的第二个缺点是,程序员很难找到它们。 它们不像构造方法那样在 API 文档中突出,因此很难找出如何实例化一个提供静态工厂方法而不是构造方法的类。 Javadoc 工具可能有一天会引起对静态工厂方法的注意。与此同时,可以通过将注意力吸引到类或接口文档中的静态工厂以及遵守通用的命名约定来减少这个问题。下面是一些静态工厂方法的常用名称。 通常,静态工厂更可取,因此避免在没有考虑静态工厂的情况下提供公共构造方法。
但还有一种技术,一个类可以提供public的静态工厂方法,只是一个返回类实例的静态方法。 静态工厂方法与设计模式的工厂方法模式不同。在设计模式中并无直接等价的说法。 而静态工厂方法有确切的名称,所以没这局限。如果一个类就是需要具有相同签名的多个构造器,那么静态工厂方法就很 nice,注意精心的命名来突出它们的区别。 这适用于基于接口的框架,其中接口为静态工厂方法提供了自然的返回类型。 Java 8 前,接口不能有静态方法。 通过在类或接口文档中多关注静态工厂方法,遵守通用命名约定的方式来减少这个困扰。 下面是一些静态工厂方法的习惯命名。 通常静态工厂更可取,因此切忌不考虑静态工厂就提供public构造器。 参考 effective java
Boolean.TRUE:Boolean.FALSE; 3 } 注意这一点:一个静态的工厂方法不同于来自设计模式的工厂模式。这个静态工厂方法描叙的这个项目跟设计模式没有直接关联。 一个类可以通过静态工厂方法提供自己的客户端;或者使用公共构造函数;使用静态工厂方法而不是公共构造函数有优点也有缺点。 ;java的文档有一天也许会关注到静态工厂方法。 有一些静态工厂方法的常规名字。 ,值得去理解他们的相对优点,通常静态工厂方法是优先选择的,所以尝试避免在不优先考虑静态工厂方法的时候使用反射来调用公共构造函数; 我的快速记忆MIND 我的看法 使用静态工厂方法去创建实例有明显的优势,
然而,还有一种重要的技术,应该成为每个程序员工具箱中的一部分,那就是使用公共的静态工厂方法。静态工厂方法是一个静态方法,返回类的实例。这种方法为我们提供了比构造函数更灵活和可读的创建对象的方式。 Boolean.TRUE : Boolean.FALSE; } 需要强调的是,静态工厂方法与设计模式中的工厂方法模式并不相同。这里描述的静态工厂方法在设计模式中没有直接的等价物。 优点 使用静态工厂方法而非公共构造函数具有多个优点: 命名的灵活性:静态工厂方法可以有名字,这使得其使用更加直观。 相反,使用静态工厂方法可以灵活地创建不同类型的对象而不需要这些困扰。 实现缓存:静态工厂方法可以返回相同的实例,而不是每次都创建一个新对象。 缺点 然而,使用静态工厂方法也有一些缺点: 不易于识别:由于静态工厂方法不是构造函数,因此它们不如构造函数直观。
设计模式中的静态工厂,到底解决了什么问题? 一、基本说明 静态工厂模式是一种创建型设计模式,通常是通过一个静态方法创建实例对象,而不是通过构造函数直接暴露给客户端。 静态工厂模式解决了以下主要问题: 名称更明确:构造函数本身没有名称,它们仅通过参数列表进行区分。如果一个类需要多种方法来初始化其对象,静态工厂方法可以有描述性的名称,使得客户端代码更容易理解和使用。 不必每次调用都创建新对象:如果应用需要重用实例,静态工厂方法可以控制其创建过程。例如,单例模式或者缓存已经创建的实例,可以通过静态工厂方法返回这些实例,避免了不必要的对象创建。 参数化实例创建:可以通过传递参数给静态工厂方法来动态地选择返回哪一个具体实现的对象。 静态工厂方法与其他的静态方法实际上没有任何区分,对于编程新手可能会造成理解上的困惑。 总而言之,静态工厂方法是一种非常有用的设计模式,它提供了一种比构造函数更灵活的对象创建机制。
,静态的工厂方法就没有我们前面所说的限制了 所以,当有需要多种构造方法的时候,去创建静态工厂方法,然后用特殊名字来区分它们是一种更加优的策略 第二个优点是,当这些静态工厂方法被使用的时候,并不需要创建一个新的对象 当然,使用静态工厂方法不仅仅能够使得返回的类是非public的,还能根据静态工厂的参数不同来使调用不同,任意声明了返回类型的子类型的类是被允许的,这样增强了软件的稳定性和表现 Java中的EnumSet ,编译器可以帮你整理那些参数,这就是我们所知的类型推断(Type Inference),我们可以使用静态工厂在HashMap上,假设HashMap提供下面这个静态工厂 public static <K, 第二个缺点是,静态工厂方法不容易和其他的静态方法区分,它们并没有在API文档中如同构造器一样,所以可能去解决怎样去初始化一个提供静态工厂方法而不是构造器的类的时候会有点困难,javadoc工具可能有一天可以关注一下这些静态工厂的方法 public构造方法没不是优先考虑一下静态工厂
为什么要用静态工厂方法代替构造方法??? 静态方法有名称。构造器名和类名一致,静态方法名可以自己定义,例如,BigInteger.probalePrime,可读性强. 静态方法, 不必每次调用他的时候都新建一个对象。这也是为啥推荐使用Boolean.valueOf(),不推荐new 静态方法有返回值,可以返回原返回类型任何子类对象,有更大的灵活性。 IllegalArgumentException("No provider registered with name: " + name); } return p.newService(); } } 静态工厂方法代替构造器去创建对象 测试类: public class Test { /** * 静态工厂方法主要缺点,类如果不含公有的或者受保护的构造器,就不能子类话。 * 静态工厂的第二个缺点在于,他们与其他静态方法实际上没有其他区别。
hongtenzone@foxmail.com) 9 * @date 2013-2-22 10 */ 11 public class Train { 12 13 /** 14 * 静态变量 21 * 也就是限制了Train本身生成多个对象 22 */ 23 private Train(){ 24 } 25 /** 26 * 这里使用了静态工厂模式得到一个