首页 > 代码库 > 张小二求职 之 静态工厂方法

张小二求职 之 静态工厂方法

工厂:创建对象用的,与单例模式一样,属于创建型模式,如何创建呢?

M:好久不见啊,小二,最近又学啥设计模式了?来找我探讨探讨。

z:最近看了设计模式中Factory(静态工厂) ,工厂方法,和抽象工厂

M:好啊,那我可要考考你啊。我们聊过单例模式,你这三个设计模式与单例模式什么相同点呢?

z:他们都是创建模式,说白了,就是如何创建对象。

M:说道如何创建对象,你知道java中创建对象的有哪些方法吗?

z:略知一二,1.new不用说2.clone方法,clone不用调用构造函数,直接复制的3.反序列化4,反射,最终调用构造函数实现,可以复习一下、

M;单例模式是保证内存中只有一个对象,但是这些模式创建对象就new 一个呗,搞这些多费事啊,他们解决了什么问题呢?

z:我们设立工厂,由工厂创建对象,这样我们就不用了解工厂如何创建对象的,只要只要如何获得对象的接口就行,一旦创建对象的方式发生变化,不会影响到我们的,这样,我们就是面向接口编程而不是具体代码,因此耦合度降低了

M;不错,面向接口编程,说到我心坎了,来谈谈吧,静态工厂,举个最简单的例子,

z:http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html中,上回我们说的单例模式,就是静态工厂

public static Singleton getInstance(){  return new Singleton();}

 

  在静态方法中调用new 返回对象。

其次,jdk中的Integer中有三个静态方法,如下

 

 

static IntegervalueOf(int i)
          Returns a Integer instance representing the specified int value.
static IntegervalueOf(String s)           Returns an Integer object holding the value of the specified String.
static IntegervalueOf(String s, int radix)           Returns an Integer object holding the value extracted from the specified String when parsed with the radix given by the second argument.

Integer有三个静态方法  Integer i=Integer.valueof("1");

是利用构造函数创建对象,而是利用静态方法返回对象,

http://blog.csdn.net/zdp072/article/details/17470765

M:简单工厂方法,工厂方法,抽象工厂方法,按照他们的优缺点系统阐述这些方法吧。

z:  简单工厂方法(所有产品一个工厂,根据输入值,确定生产什么)

 

//抽象产品
interface
car{ public void run();}

 

//具体产品
public class 公交车 implements car{  public void run(){System.out.println("so many pople");}}

public class 小轿车 implements car{  public void run(){System.out.println("优哉游哉的跑着");}}
 

一个简单的汽车工厂,什么车都生产啊。
public class CarFactory
{
public car getCar(String type)
{
if(type.euqlas("小轿车"))
return new "小轿车";
if(type.euqlas("公交车"))
return new 公交车();
}


}

//
使用工厂:
CarFactory fac=new CarFactory()
car MyCar=fac.getCar("小轿车");
car.run();

 

 

 

M:简单工厂有什么缺点嘛?

z:不符合开闭原则,说白了,要是新家一种车,必须修改carFactory啊。我们尽量扩产类而不是在需求改变的时候修改类。

M:那么工厂方法呢?解决了这个问题了吗?

z:解决了。工厂方法是一个具体产品一个工厂。如同上文中工厂方法改为

抽象工厂
interface
factory{public car getCar();}
public 小轿车工厂 implements factory
{
public car getCar()
{
return new 小轿车工厂();
}

}
//调用
factory fac=new 小轿车工厂();
car myCar=fac.getCar();
car.run();

 

M:一个产品一个工厂,实际情况是一个产品族一个工厂,这个情况用什么模式解决呢?