设计模式——工厂模式
一、定义与简单实现
1、定义
工厂模式分为:工厂方法模式,抽象方法模式。
简单/静态工厂模式不是一种独立的设计模式,只是一种编程习惯。《Effective Java》中第一条就是“考虑使用静态工厂方法代理构造器(构造方法创建对象)”
工厂方法模式:
-
定义一个创建对象的接口(通常是一个抽象类)
-
让实现这个接口的类来决定实例化哪个类。
-
工厂方法让类的实例化推迟到子类中进行(这里工厂方法模式跟模板模式容易混淆,工厂方法模式关注的是创建对象,模板模式关注的是方法的执行)
抽象工厂模式:定义有点抽象,如果不能理解,过段时间就忘记了。
- 提供接口,
- 创建一系列相关或独立的对象,
- 而不指定这些对象的具体类
从定义可以看出工厂模式与抽象工厂模式的最大区别:接口实现的效果不同。
2、UML类图
工厂方法模式:创建的接口:关注点是一个对象的创建,而且是延迟到子类创建。
//工厂模式 HotDryNoodles hdn = createHotDryNoodles();
//抽象方法,延迟到子类创建
private abstract HotDryNoodles createHotDryNoodles();
抽象工厂模式:创建的接口:关注点一类对象的创建,这类对象创建的细节小对象还是依靠工厂模式完成的。
两种模式都:封装了对象的创建,减少了应用程序和具体类之间的依赖促进松耦合。只不过
- 工厂方法模式注重单个对象创建
- 抽象工厂模式注重一类对象创建,一类对象创建细节小对象最终还是由工厂方法模式创建的。
两种模式其实都注重了设计原则中:
- 要依赖于抽象,不依赖于具体实现(依赖倒置原则)
- 针对接口编程,不针对实现编程
- 为交互对象之间的松耦合设计而努力
3、简单实现
public interface HotDryNoodles { } public abstract class HotDryNoodlesFactory { HotDryNoodles getHotDryNoodles(){ return createHotDryNoodles(); } protected abstract HotDryNoodles createHotDryNoodles(); } public class WuHanHotDryNoodles implements HotDryNoodles { @Override public String toString() { return "made in WuHan"; } } public class WuHanFactory extends HotDryNoodlesFactory { @Override public HotDryNoodles createHotDryNoodles() { System.out.println("WuHan HotDryNoodles!"); return new WuHanHotDryNoodles(); } } public class Main { public static void main(String[] args) { System.out.println("create 。。。"); HotDryNoodlesFactory factory = new WuHanFactory(); HotDryNoodles hotDryNoodles = factory.getHotDryNoodles(); System.out.println(hotDryNoodles.toString()); } }
二、框架中的工厂模式
1、Executors——静态工厂方法模式
JDK并发包中的Executors创建线程池就是一个典型的静态工厂方法模式。
public class Executors { public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); } public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())); } public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) { return new ScheduledThreadPoolExecutor(corePoolSize); } }
2、Spring中的FactoryBean——工厂方法模式
FactoryBean是Spring中接口代理的具体实现,包括Mybaits的接口映射技术,dubbo的RPC调用调用。
3、抽象工厂模式还未找到