工厂模式在《Java与模式》中分为三类:
1)简单工厂模式(Simple Factory)
2)工厂方法模式(Factory Method)
3)抽象工厂模式(Abstract Factory)
这三种模式从上到下逐步抽象,并且更具一般性。
GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。
简单工厂模式是类的创建模式,又叫静态工厂方法模式,是由一个工厂对象决定创建出哪一种产品类的实例。
简单工厂模式就是由一个工厂类根据传入的参量决定创建出哪一种产品类的实例,涉及到工厂角色、抽象产品角色以及具体产品角色。
1 工厂类角色:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑关系。工厂类在客户端直接调用下创建产品对象,它往往由一个具体Java类实现。
2 抽象产品角色:担任这个角色的类是由工厂方法模式所创建的对象的父类,或它们共同拥有的接口。抽象产品角色可以用一个Java接口或者Java抽象类实现。
3 具体产品角色:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体Java类实现。
下面是简单工厂模式的简单实现:
package com.dxz.pattern.simplefactory;
public interface Fruit { /** * 生长 */ void grow();
/** * 收获 */ void harvest();
/** * 种植 */ void plant(); } package com.dxz.pattern.simplefactory;
public class Apple implements Fruit {
@Override public void grow() { System.out.println("苹果在成长!"); }
@Override public void harvest() { System.out.println("苹果大丰收!"); }
@Override public void plant() { System.out.println("播种苹果!"); }
} package com.dxz.pattern.simplefactory;
public class Grape implements Fruit {
@Override public void grow() { System.out.println("葡萄在成长!"); }
@Override public void harvest() { System.out.println("葡萄大丰收!"); }
@Override public void plant() { System.out.println("播种葡萄!"); }
} package com.dxz.pattern.simplefactory;
public class Orange implements Fruit {
@Override public void grow() { System.out.println("橘子在成长!"); }
@Override public void harvest() { System.out.println("橘子大丰收!"); }
@Override public void plant() { System.out.println("播种橘子!"); }
} package com.dxz.pattern.simplefactory;
public class FruitFactory { /** * 静态工厂方法(简单工厂方法) * @param msg * @return */ public static Fruit getFruit(String msg) { if (msg.equals("Apple")) { return new Apple(); } else if (msg.equals("Orange")) { return new Orange(); } else if (msg.equals("Grape")) { return new Grape(); }
return null; } } package com.dxz.pattern.simplefactory;
public class MainClass {
/** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String msg = "Apple"; Fruit fruit = FruitFactory.getFruit(msg); fruit.grow(); fruit.harvest(); fruit.plant(); }
} |
简单工厂模式的优点和缺点:
在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。
不难发现,简单工厂模式的缺点也正体现在其工厂类上,由于工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做的并不好。另外,当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,扩展性并不很好。