也称静态工厂方法模式(Static Factory Method),简单工厂模式是由一个工厂类决定创建出哪一种产品类的实例,不属于23种GOF设计模式之一。
简单工厂模式的结构
类图与角色
工厂类(Creator):负责生产产品,提供一个静态方法且其返回类型为Product,通过方法参数来决定生产哪种类型的具体产品。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体Java类实现。
产品接口(Product):具体产品必须实现的接口。
具体产品(Concrete Product):对Product接口的实现。
示例
//抽象产品接口
interface Fruit{
//生长
public void grow();
//收获
public void harvest();
//种植
public void plant();
}
//具体产品
class Apple implements Fruit{
@Override
public void grow(){
System.out.println("Apple is growing");
}
@Override
public void harvest(){
System.out.println("Apple has been harvested");
}
@Override
public void plant(){
System.out.println("Apple has been planted");
}
}
class Orange implements Fruit{
@Override
public void grow(){
System.out.println("Orange is growing");
}
@Override
public void harvest(){
System.out.println("Orange has been harvested");
}
@Override
public void plant(){
System.out.println("Orange has been planted");
}
}
//工厂类
class FruitGardener{
public static Fruit getFruit(String which) throws Exception{
if(which.equalsIgnoreCase("apple")){
return new Apple();
}else if(which.equalsIgnoreCase("orange")){
return new Orange();
}else{
throw new Exception("No this Fruit");
}
}
}
//客户端代码
class test {
public static void main (String[] args) throws java.lang.Exception {
Fruit fruit=FruitGardener.getFruit("apple");
fruit.plant();
fruit.grow();
fruit.harvest();
fruit=FruitGardener.getFruit("orange");
fruit.plant();
fruit.grow();
fruit.harvest();
}
}
优点
工厂类含有必要的判断逻辑来决定什么时候创建以及创建什么类型的产品。而客户端则可以免除直接创建产品对象的责任,而仅仅负责消费产品,实现了创建对象和使用对象的职责分离。
Java中的应用
DateFormat 抽象类及其子类(SimpleDateFormat )用于格式化一个本地日期或者时间,该工具类在处理日期及时间格式上很有用处。
DateFormat 提供了三个重载的静态方法getDateInstance(),并声明返回类型为DateFormat 类型。
getDateInstance()方法返回一个SimpleDateFormat 的实例。显然,这里使用静态工厂方法是为了将具体子类实例化的工作隐藏起来,从而客户端不必考虑如何将具体子类实例化,因为抽象类DateFormat 的静态工厂方法会提供合适的具体子类的实例。