zoukankan      html  css  js  c++  java
  • 设计模式——工厂模式

    一、定义与简单实现

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

  • 相关阅读:
    标识符
    注释
    关键字
    第一个JAVA程序
    JAVA运行机制
    每个程序员都应该知道的延迟数
    构建WebDriverAgent时报错“xxx: no identity found Command CodeSign failed with a nonzero exit code”解决办法
    执行 sh ./Scripts/bootstrap.sh -d 时提示“xcrun: error: unable to find utility “simctl”, not a developer tool or in PATH ”错误解决办法
    stf ios版本部署
    centos 7安装一机多控stf客户端
  • 原文地址:https://www.cnblogs.com/wqff-biubiu/p/12625018.html
Copyright © 2011-2022 走看看