构造器与工厂方法的区别

原文地址:http://leihuang.net/2014/11/09/Constructors-VS-Factory-Methods/

首先看下面两者在创建对象上的区别

// instantiating a class using constructor
Dog dog = new Dog();

// instantiating the class using static method
Class Dog{
  private Dog(){
  }
  // factory method to instantiate the class
  public static Dog getInstance(){
    return new Dog();
  }
}

下面谈谈静态工厂方法的优缺点:

优点:

1.静态工厂方法有名字而构造函数没有

因为工厂方法可以有多个,通过名字来区别各个方法,但构造函数名字只能有一个,只能通过参数来区别,所以使用静态工厂方法更明了。

2.静态工厂方法支持条件性实例化

就是说你创建对象时,有时需要添加一些条件判断是否应该创建,如果满足条件则返回一个实例,不满足则返回NULL,比如单例模式。构造函数时做不到这样的,而静态工厂方法可以很简单的做到。

3.方法能够返回返回类型的子类型

Suppose there is a class Animal and it has subclass Dog. We have static method with signature

  public static Animal getInstance(){

  }

then method can return Both objects of type Animal and Dog which provides great flexibility.

缺点:

1.If constructor of the class is not public or protected then the class cannot be sub classed

如果一个类只能通过静态工厂方法来获得实例,那么该类的构造函数就不能是共有的或受保护的,那么该类就不会有子类,即该类不能被继承。单例模式中首先要私有化构造器

2.静态工厂方法和其他静态方法从名字上看无法区分

下面就是静态工厂方法常用的命名

valueOf —Returns an instance that has, loosely speaking, the same value as its parameters. Such static factories are effectively type-conversion methods.

of —A concise alternative to valueOf , popularized by EnumSet

getInstance —Returns an instance that is described by the parameters but cannot be said to have the same value. In the case of a singleton, getInstance takes no parameters and returns the sole instance.

newInstance —Like getInstance , except that newInstance guarantees that each instance returned is distinct from all others.

getType—Like getInstance , but used when the factory method is in a different class. Type indicates the type of object returned by the factory method.

newType—Like newInstance , but used when the factory method is in a different class. Type indicates the type of object returned by the factory method.



2014-11-09 14:39:17

Brave,Happy,Thanksgiving !

时间: 2024-11-10 13:00:20

构造器与工厂方法的区别的相关文章

简单工厂 和 工厂方法的区别

简单工厂模式..就是通过判断逻辑   传入参数来判断实例化相关的类..对于客户端来说.去掉了与具体产品的依赖..但是如果增加一个功能类.就需要修改工厂类(比如加入判断条件).这就不是一个好的办法了.. 但是使用工厂方法类..的话.就相当于给每一个功能类创建了一个工厂.好处在于.每添加一个功能类就对应添加一个工厂类就可以了.不由他自己决定创建某个功能类,而是让工厂的子类来决定实例化哪一个功能类.功能方法使 一个类的实例化延迟到了其子类.. 可能脑子不灵活:这里大话设计模式看的比较清楚. 简单工厂

构造器与工厂方法的差别

原文地址:http://leihuang.org/2014/11/09/Constructors-VS-Factory-Methods/ 首先看以下两者在创建对象上的差别 // instantiating a class using constructor Dog dog = new Dog(); // instantiating the class using static method Class Dog{ private Dog(){ } // factory method to inst

Java构造器以及与方法的区别

功能不同: 构造器是为了创建一个类的实例:命名与类相同:可以有任何访问的修饰: public, protected, private或者没有修饰,不能有以下非访问性质的修饰: abstract, final, native, static, 或者 synchronized:无返回值. 方法是为了实现类的一个动作. 以下为复制别人的博客内容: "this"的用法构造器和方法使用关键字this有很大的区别.方法引用this指向正在执行方法的类的实例.静态方法不能使用this关键字,因为静态

java的构造器和void方法的区别

void型的方法什么都不返回,但这是你决定的,你也可以让它返回些什么.而构造函数则什么都不返回,而且你别无选择."----这句话的意思是,是你决定让这个方法返回void类型的,你也可以改变它不让它返回的是void,而返回其他的类型如int,String等.但是对构造方法你就没机会决定它的返回类型是什么了. The constructor is an unusual type of method because it has no return value. This is distinctly 

Effective JAVA NO1考虑用静态工厂方法代替构造器

NO1.考虑用静态工厂方法代替构造器 静态工厂方法与构造器不同的第一大优势在于它们有名称: 静态工厂方法与构造器不同的第二大优势在于,不必在每次调用它们的时候都创建一个新对象: 第三大优势,它们可以返回原返回类型的任何子类型的对象: 第四大优势,在创建参数化类型实例的时候,它们使代码变得更加简洁: 缺点: 1.类如果含公有的或者受保护的构造器,就不能被子类化. 2.它们与其他的静态方法实际不上没有任何区别.

简单工厂、工厂方法、抽象工厂区别

设计模式:简单工厂.工厂方法.抽象工厂之小结与区别 大话设计模式之简单工厂模式.抽象工厂模式及工厂方法模式的比较 抽象工厂模式-与-工厂方法模式区别 在简单工厂模式下,工人要想到种植萝卜还是白菜,在工厂模式下,工人想到是种植根菜还是茎菜,而在抽象工厂模式下,则关心种植基因菜还是非基因菜

设计模式(三) : 创建型模式--工厂方法模式

工厂方法模式区别与简单工厂模式主要在于,factory中对对象的实例化延迟到了子类的factory中, 这也是优于简单工厂的地方.下面看这个模式的类图(截自<java与模式>): 示意性代码: ? 1 2 3 4 5 6 7 package com.javadesignpattern.factorymethod; public interface Creator {          public Product fatcory(); } package com.javadesignpatte

工厂模式:简单工厂、工厂方法、抽象工厂

一.简介 工厂模式主要是为创建对象提供接口,让子类决定实例化哪个类.按照<Java与模式>可以分为: 1.简单工厂模式 2.工厂方法模式 3.抽象工厂模式 二.简单工厂 适用于业务简单的情况:小项目或具体产品扩展很少的情况. 它由以下三种角色组成: 具体工厂类 抽象产品类 具体产品来 UML类图关系如下: 三.工厂方法 概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法将一个类的实例化延迟到其子类. 有以下角色组成: 抽象工厂类 具体工厂类 抽象产品类 具体产品类 UML类图

Java学习笔记——设计模式之五.工厂方法

水边一只青蛙在笑 --石头和水 工厂方法模式(Factory Method),定义了一个用于创建对象的接口,让实现类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 这里在简单和工厂的基础上写工厂: 先定义一个接口 1 package cn.no5.factorymethod; 2 3 import cn.no1.simplefactory.Operation; 4 5 public interface IFactory { 6 7 Operation CreateOperation(