简单工厂模式就是由一个工厂类根据传入的参数决定创建出哪一种产品类的实例。
简单工厂模式又称为静态工厂方法模式(Static Factory Method Pattern),因为其主要逻辑方法多用static关键字修饰。
这种模式下,客户端只负责发送参数,由工厂对象去决定创建哪种产品。
优缺点
- 优点
简单工厂模式的核心是工厂类,其中包含了必要的判断逻辑,由此决定应该去创建哪个对象。
而客户端不需要去了解如何创建产品,完全和产品逻辑解耦,它只负责发送指令去“消费”就好了。
- 缺点
创建所有产品的逻辑都放在工厂类中,工厂需要知道每一种产品的创建过程,逻辑过于集中。
添加新的产品生产逻辑时,势必会违反开闭原则,因为要修改工厂类。
Java中的简单工厂
DateFormat类中有以下静态方法:
public final static DateFormat getDateInstance()
public final static DateFormat getDateInstance(int style)
public final static DateFormat getDateInstance(int style, Locale aLocale)
这些方法根据传入参数去构造一个DateFormat的子类对象并返回,而客户端只需要传递参数即可,不去关心具体的子类类型。
如果没有这些简单工厂方法,客户端则需要去了解DateFormat的子类,自己去指定去new哪个子类的对象。
Spring
spring中BeanFactory有如下方法:
Object getBean(String var1) throws BeansException;
<T> T getBean(String var1, Class<T> var2) throws BeansException;
Object getBean(String var1, Object... var2) throws BeansException;
<T> T getBean(Class<T> var1) throws BeansException;
<T> T getBean(Class<T> var1, Object... var2) throws BeansException;
这就是简单工厂的使用例子,而工厂接收的参数可以通过读取如下配置方式传入:
<bean id="helloWorld"
class="com.test.spring.beans.HelloWorld"></bean>
实例
需求: 创建一个生产蒙牛,伊利,特仑苏牛奶的简单工厂。
- 牛奶抽象接口
package com.faith.net;
/**
* 牛奶抽象接口
*/
public interface Milk {
/**
* 获取一个标准产品
* @return
*/
public String getName();
}
- 特仑苏牛奶
package com.faith.net;
/**
* 特仑苏
*/
public class Telunsu implements Milk {
@Override
public String getName() {
return "特仑苏";
}
}
- 伊利牛奶
package com.faith.net;
/**
* 伊利
*/
public class Yili implements Milk {
@Override
public String getName() {
return "伊利";
}
}
- 简单工厂
package com.faith.net.simple;
import com.faith.net.Mengniu;
import com.faith.net.Milk;
import com.faith.net.Telunsu;
import com.faith.net.Yili;
/**
* 简单工厂
*/
public class SimpleFactory {
public static Milk getMilk(String name){
if("telunsu".equals(name)){
return new Telunsu();
}else if("yili".equals(name)){
return new Yili();
}else if("mengniu".equals(name)){
return new Mengniu();
}else {
throw new RuntimeException("wrong request");
}
}
}
- 客户端
package com.faith.net.simple;
/**
* 客户端
*/
public class SimpleFactoryTest {
public static void main(String[] args) {
SimpleFactory.getMilk("telunsu");
}
}