工厂模式是最常用的设计模式~~虽然网上是这么说,实际上是不是不知道,只是在平时开发时确实又看到过,比如android开发里引用三方的库AchartEngine,里面初始化一个自定义内容的渲染器类后,将其作为参数传给Factory类的静态方法就可以返回一个折现图,或者柱状图等等。
这种模式下,使用者并不需要关心其工厂内部是如何生产其产品类,只需要明确产品的类别和指定其某些属性就可以让工厂生产出来,当需要增加产品的类别时,只需要在工厂内扩展就可以了。However,工厂模式也有缺点,比如若扩展一个产品,那么就会增加系统的复杂性,一个工厂就会越来越庞大。当需要实现一个简单的产品时,往往自己动手就可以了,用了工厂模式反而造成牛刀小试的效果,也浪费资源。
在代码中其实也很好理解,这里通过水果例子来说明:
首先,创建一个接口,该接口提供了水果类的信息显示功能。
public interface Fruit {
void printInfo();
}
然后,创建一些具体的产品,这些产品都属于水果类,需要实现水果类的信息显示功能:
public class Apple implements Fruit{
@Override
public void printInfo() {
// TODO Auto-generated method stub
System.out.println("苹果");
}
}
public class Banana implements Fruit{
@Override
public void printInfo() {
// TODO Auto-generated method stub
System.out.println("香蕉");
}
}
public class Orange implements Fruit{
@Override
public void printInfo() {
// TODO Auto-generated method stub
System.out.println("橙子");
}
}
接下来,搭建一个工厂,该工厂可以根据用户需求生产相对应的产品:
public class FruitFactory {
public static final int APPLE=1;
public static final int BANANA=2;
public static final int ORANGE=3;
public Fruit getFruit(int fruitType){
if(fruitType==APPLE){
return new Apple();
}
if(fruitType==BANANA){
return new Banana();
}
if(fruitType==ORANGE){
return new Orange();
}
return null;
}
}
最后,测试一下:
public static void main(String[] args) {
// TODO Auto-generated method stub
FruitFactory fruit=new FruitFactory();
Fruit apple=fruit.getFruit(FruitFactory.APPLE);
apple.printInfo();
Fruit banana=fruit.getFruit(FruitFactory.BANANA);
banana.printInfo();
Fruit orange=fruit.getFruit(FruitFactory.ORANGE);
orange.printInfo();
}
结果: