这是本系列的第三篇博客,这次主要来说一下工厂模式。
基本工厂模式
简单来说工厂模式是将工程中的相同类型对象的创建活动集中管理,一般通过反射来生成外界需要的实体类。比如Spring中的容器Bean概念,通过Spring BeanFactory来产生不同的Bean
这样做有两个好处:
1. 便于之后的实体类的拓展性
2. 可以方便的进行不同实体类的具体初始化(Init)方案
我们这里来用一个水果店来说明这个设计模式的大体思路:
- 水果店中售卖的水果是一系列相似的产品
- 这些产品都是可以被购买的(相似的行为抽象接口)
- 水果店是可以售卖当前所有的水果的(工厂可以产生这一系列产品实体类)
那么我们来定义水果的interface
/**
* Created by youweixi on 15/12/5.
* 水果接口
*/
public interface Fruit {
void sell();
}
苹果实体类:
/**
* Created by youweixi on 15/12/5.
* 苹果实体类
*/
public class Apple implements Fruit{
@Override
public void sell() {
System.out.println("Sell One Apple");
}
}
香蕉和梨略
现在来构建一个工厂类,我们这里因为用不到抽象工厂类,所以只需要建立一个实体类即可,这个实体类可以通过反射来生成指定的实体类。
/**
* Created by youweixi on 15/12/5.
* 水果店工厂类
*/
public class FruitFactory {
public static Fruit createFruit(String className){
try {
return (Fruit) Class.forName(className).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
测试:
public static void main(String[] args){
createFruit("com.bigtomato.programodel.factory.Apple").sell();
createFruit("com.bigtomato.programodel.factory.Pear").sell();
createFruit("com.bigtomato.programodel.factory.Banana").sell();
}
Sell One Apple
Sell One Pear
Sell One Banana
抽象工厂模式
所谓的抽象工厂模式只不过是在应对多种系列商品的一种工厂模式。说简单点就是所有的工厂共同实现一个工厂接口或者继承某个工厂基类,在此不再赘述了。
总结
工厂类说到底,其实没有避免对象的创建操作,但是一般来说,工厂类和其他设计模式结合才能进一步优化软件设计思路。
- 工厂类和实例池结合可以实现限制当前环境中的实例个数(如一些数据库连接池,每次请求的实例其实是直接从空闲连接中取出,这样的速度会很快,使用完毕之后会返回给工厂)
- 工厂类可以初始化不同的实例对象,这点可以降低程序代码冗余度,使从工厂中获取到的对象都按照一定的标准进行了初始化(有兴趣的同学可以参看一下Spring Bean 中的Bean初始化方式)