简单工厂模式
简单工厂模式是类的创建模式,又叫做静态工厂方法模式。简单工厂模式由一个工厂对象决定产出哪种产品的实例。
为什么使用简单工厂模式
原因:解耦。
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.使用反射效率会低一些。