工厂:创建对象用的,与单例模式一样,属于创建型模式,如何创建呢?
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 Integer |
valueOf(int i) Returns a Integer instance representing the specified int value. |
static Integer |
valueOf(String s) Returns an Integer object holding the value of the specified String . |
static Integer |
valueOf(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:一个产品一个工厂,实际情况是一个产品族一个工厂,这个情况用什么模式解决呢?
原文:http://www.cnblogs.com/hansongjiang/p/3836867.html