基本概念
简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。
在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例;
特点:
- 在创建一个对象时不向客户暴露内部细节,并提供一个创建对象的通用接口。
- 在简单工厂模式中,可以根据参数的不同返回不同类的实例。
- 简单工厂模式专门定义一个类来负责创建其他类的实例
基本结构图:
组成成员:
- Factory:工厂角色 工厂角色负责实现创建所有实例的内部逻辑
- Product:抽象产品:所创建的所有对象的父类,负责描述所有实例所共有的公共接口
- ConcreteProduct:具体产品是创建目标,所有创建的对象都充当这个角色的某个具体类的实例
具体代码演示
public interface Fruit {
void plant();
void grow();
void harvest();
}
public class Apple implements Fruit {
@Override
public void plant() {
System.out.println("Apple.plant()");
}
@Override
public void grow() {
System.out.println("Apple.grow()");
}
@Override
public void harvest() {
System.out.println("Apple.harvest()");
}
}
public class Grape implements Fruit {
@Override
public void plant() {
System.out.println("Grape. plant()");
}
@Override
public void grow() {
System.out.println("Grape. grow()");
}
@Override
public void harvest() {
System.out.println("Grape. harvest()");
}
}
public class SimpleFactory {
public static Fruit getFruit(String fruit){
if("apple".equalsIgnoreCase(fruit)){
return new Apple();
}else if("grape".equalsIgnoreCase(fruit)){
return new Grape();
}else{
return null;
}
}
public static void main(String[] args) {
Fruit apple = SimpleFactory.getFruit("Apple");
apple.grow();
Fruit grape = SimpleFactory.getFruit("Grape");
grape.harvest();
}
}
/**
* 通过反射机制获取对应类的instance
*/
public class BetterSimpleFactory {
public static Fruit getInstance(String fullPath) throws Exception {
Class<?> aClass = Class.forName(fullPath);
return (Fruit)aClass.newInstance();
}
public static void main(String[] args) throws Exception {
Fruit apple = BetterSimpleFactory.getInstance("designPattern.factory.simpleFactory.Apple");
apple.harvest();
Fruit grape = BetterSimpleFactory.getInstance("designPattern.factory.simpleFactory.Grape");
grape.plant();
}
}
使用场景说明:
- 工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂
- 客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数
在Java中的应用
JDK类库中广泛使用了简单工厂模式,如工具类java.text.DateFormat,它用于格式化一个本地日期或者时间
public final static DateFormat getDateInstance();
public final static DateFormat getDateInstance(int style);
public final static DateFormat getDateInstance(int style,Locale
locale);