工厂模式
工厂模式是java中23种设计模式之一,在spring中bean管理使用了大量的工厂模式,为了能够更好的理解spring源码,在此温馨下工厂设计模式,希望能够借此温故而知新。
工厂模式分类
工厂模式分为三类:简单工厂,工厂方法,抽象工厂。
1.简单工厂模式,又称静态工厂方法模式。(此模式用得比较少)
通过专门定义一个类来负责创建其它类的实例,被创建的实例通常都具有共同的父类。
示例:
public interface Fruit {
void eat();
}
public class Apple implements Fruit {
@Override
public void eat() {
System.out.println("吃苹果");
}
}
public class Banana implements Fruit{
@Override
public void eat() {
System.out.println("吃香蕉");
}
}
//创建FruitFactory工厂类: 这样就可以通过工厂类的getFruit()类获取需要的对象了。
public class FruitFactory {
public static Fruit getFruit(String name) throws Exception {
if (name.equalsIgnoreCase("apple")){
return Apple.class.newInstance();
}else if (name.equalsIgnoreCase("banana")){
return Banana.class.newInstance();
}else {
return null;
}
}
}
总结:这样的代码个人感觉没啥好处,除了代码逻辑美观。但它的作用就是不需要过多关心对象是如何构建的,直接调用即可,有点想原生的jdbc写法。
2.工厂方法模式,又称多态工厂模式。
工厂方法模式是对简单工厂模式的抽象升级,将工厂这个概念抽象出来成为接口,然后针对每种目标实现类创建一个工厂实现,一对一来实现,当新增了目标实现,只要同时新增一个工厂实现即可。
示例:同样引用上面的Fruit接口和实现类
//定义一个水果工厂接口
public interface FruitFactory{
Fruit createFruit();
}
//定义一个苹果工厂类实现水果工厂接口
public class AppleFactory implements FruitFactory{
@Override
public Fruit careateFruit() {
return new Apple();
}
}
//定义一个香蕉工厂类实现水果工厂接口
public class BananaFactory implements FruitFactory{
@Override
public Fruit careateFruit() {
return new Banana();
}
}
//测试类
public class Test {
public static void main(String[] args) {
FruitFactory factory = new BananaFactory();
Fruit fruit = factory.createFruit();
System.out.println(fruit.eat());
}
}
输出结果:吃香蕉
总结:目标可以无限扩展,工厂类也要随之扩展,一对一存在,满足了开闭原则,缺点也十分明显。mybatis中使用的比较多,事务模块和数据源模块都使用了工厂方法模式。
3.抽象工厂模式,又称工具箱模式。
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
//定义抽象产品及其实现类
abstract Fruit {
public abstract void eat();
}
public class Apple implements Fruit {
@Override
public void eat() {
System.out.println("吃苹果");
}
}
public class Banana implements Fruit{
@Override
public void eat() {
System.out.println("吃香蕉");
}
}
//定义一个抽象水果工厂及其实现类
abstract FruitFactory{
public abstract Fruit createFruit();
}
public class AppleFactory implements FruitFactory{
@Override
public Fruit careateFruit() {
return new Apple();
}
}
public class BananaFactory implements FruitFactory{
@Override
public Fruit careateFruit() {
return new Banana();
}
}
总结:使对象的创建被实现在工厂接口所暴露出来的方法中。
最后:
无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。