简单工厂模式
简单工厂模式是类的创建模式,又叫做静态工厂方法模式。简单工厂模式由一个工厂对象决定产出哪种产品的实例。
为什么使用简单工厂模式
原因:解耦。
A对象如果调用B对象,最简单的方法是new一个B出来,不过如果C和B类都实现一个接口/继承一个类,那么系统需要把B类改成C类,程序不得不重写A类代码。如果程序中有100个地方new了B对象,那么要修改100处,耦合度太高。
简单工厂的实例
水果
public interface Fruit {
public void grow();
}
苹果
public class Apple implements Fruit{
public void grow() {
System.out.println("Apple grow");
}
}
葡萄
public class Grape implements Fruit{
public void grow() {
System.out.println("Grape grow");
}
}
园丁,工厂类
public class Gardener {
public static Fruit getFruit(String fruitName){
if("apple".equals(fruitName)){
return new Apple();
}else if("grape".equals(fruitName)){
return new Grape();
}
return null;
}
}
main方法
public static void main(String[] args) {
Fruit apple = Gardener.getFruit("apple");
apple.grow();
Fruit grape = Gardener.getFruit("grape");
grape.grow();
}
这样写,用户不需要自己去生产产品,只需要拿到自己的东西就好,这样代码的职责更加明确,耦合度降低了。
方法改进
上面的代码虽然进行一定的分离,但是产品数量如果不断增加那么工厂类每次都需要家if else,这样也不好。
public class Gardener {
public static Fruit getFruit(String fruitPath) throws Exception{
Class<?> c = Class.forName(fruitPath);
return (Fruit) c.newInstance();
}
}
这个地方使用了反射
main
public static void main(String[] args) throws Exception {
Fruit apple = Gardener.getFruit("algorithm.Apple");
apple.grow();
Fruit grape = Gardener.getFruit("algorithm.Grape");
grape.grow();
}
这里也有一点问题,比如要重构包的路径,那么就需要修改代码。有三种方法推荐:
1.
public interface FruitPath
{
public final static String apple = "com.xrq.simplefactory.Apple";
public final static String grape = "com.xrq.simplefactory.Grape";
}
2.
Apple=com.xrq.simplefactory.Apple Grape=com.xrq.simplefactory.Grape
3.
<apple>com.xrq.simplefactory.Apple</apple> <grape>com.xrq.simplefactory.Grape</grape>
简单工厂模式或者工厂模式关注点在于创建产品和消费产品分离。
简单工厂模式的应用
jdk中简单工厂模式有很多应用,比较典型的是线程池。我们使用线程池,可以使用ThreadPoolExecutor,根据喜好传入corePoolSize、maximumPoolSize、keepAliveTimem、unit、workQueue、threadFactory、handler这几个参数,new出一个指定的ThreadPoolExecutor出来。
工厂模式的优缺点
优点
1.简单优化了软件体系结构,明确各个模块的职责。
2.实现生产对象和使用对象的分离,解耦。
缺点
1.使用反射效率会低一些。