工厂模式是创建模式的一种,在Java程序系统可以说是随处可见。为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如Bird bird = new Bird()。 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑实用工厂模式,虽然使用工厂可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
简单示例:简单打印动物类的功能(每个版本中类的个数可能会不一样,在老的版本中出现的类却在新的版本中没有出现,则说明该类没有发生变化)
版本一:最原始的做法(相当于原始社会,调用者自己去new被调用者)
package com.zhmg.pattern;
public class Main { public static void main(String []args){
/** * 创建鸟的实例,并调用相关函数 */ Bird bird = new Bird(); bird.get();
/** * 创建猪的实例,并调用相关函数 */
Pig pig = new Pig(); pig.get(); } }
|
package com.zhmg.pattern;
public class Bird { public void get(){
System.out.println("这是定义鸟的类");
}
}
|
package com.zhmg.pattern;
public class Pig {
public void get(){
System.out.println("这是定义猪的类");
} }
|
版本二:使用接口(相当于原始社会中有了一些谋生经验)
package com.zhmg.pattern;
public interface Animal {
public void get(); }
|
package com.zhmg.pattern;
public class Pig implements Animal {
public void get(){
System.out.println("这是定义猪的类");
} }
|
package com.zhmg.pattern;
public class Bird implements Animal{ public void get(){
System.out.println("这是定义鸟的类");
}
}
|
package com.zhmg.pattern;
public class Main { public static void main(String []args){
Animal bird = new Bird(); bird.get();
Animal pig = new Pig(); pig.get(); } }
|
版本三:使用动态工厂,增加一个工厂类、修改主函数(相当于进入工业社会了)
package com.zhmg.pattern;
public class AnimalFactory {
//生产一个Bird实例返回 public Animal getBird(){
return new Bird();
} //生产一个Pig实例返回 public Animal getPig(){
return new Pig();
} }
|
package com.zhmg.pattern;
public class Main { public static void main(String []args){
//--------------使用动态工厂-----------------------
AnimalFactory factory = new AnimalFactory(); Animal bird = factory.getBird(); Animal pig = factory.getPig();
bird.get(); pig.get();
} }
|
使用静态工厂(修改工厂类、修改主函数),方便调用-----直接使用”类名.方法名”的方式
package com.zhmg.pattern;
public class AnimalFactory {
//生产一个Bird实例返回 public static Animal getBird(){
return new Bird();
} //生产一个Pig实例返回 public static Animal getPig(){
return new Pig();
} }
|
package com.zhmg.pattern;
public class Main { public static void main(String []args){
//--------------使用静态工厂-----------------------
Animal bird = AnimalFactory.getBird(); Animal pig = AnimalFactory.getPig();
bird.get(); pig.get();
} }
|
版本四:每当再增加动物的时候还需要写getXX()方法
package com.zhmg.pattern;
public class AnimalFactory {
public static Animal get(String classType) throws InstantiationException, IllegalAccessException {
if ("Bird".equalsIgnoreCase(classType)) {
return Bird.class.newInstance();
} else if ("Pig".equalsIgnoreCase(classType)) {
return Pig.class.newInstance();
} else {
System.out.println("未能找到匹配的类型");
return null;
} } }
|
package com.zhmg.pattern;
public class Main { public static void main(String []args) throws InstantiationException, IllegalAccessException{
//------------使用静态工厂------------------------- Animal bird = AnimalFactory.get Animal ("bird"); Animal pig = AnimalFactory.get Animal ("pig");
bird.get(); pig.get(); } }
|
总结:
*简单工厂,通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
*简单工厂中的角色及职责:
1.工厂(Creator)角色
核心,负责实现创建所有实例。工厂类可以被外界直接调用,创建所需的产品对象。
2.抽象(Product)角色
工厂所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
3.具体产品(Concrete Product)角色
工厂所创建的具体实例对象
*优缺点
在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系
结构的优化。
不难发现,简单工厂模式的缺点也正体现在其工厂类上,由于工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做的并不好。另外,当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,扩展性并不很好。