设计模式——工厂模式

一、定义与简单实现

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、抽象工厂模式还未找到

 

posted on 2020-04-03 10:38  FFStayF  阅读(203)  评论(0编辑  收藏  举报