设计模式之Factory(工厂设计模式)

版权声明:未经允许转载,将保留追究其法律责任 https://blog.csdn.net/qq_37025563/article/details/86475473
  • 工厂模式是我们很常用的模式了,著名的spring框架就使用了工厂模式。

  • 为什么说工厂模式是最常用的,因为工厂模式就相当于创建对象的new。工厂模式就是用来创建对象的

  • 在PatternsInJava
    书中把工厂模式主要分为:工厂方法与抽象工厂,当然这本书在举例的时候用比较简单的实例,让你来明白工厂模式具体来做什么,但是在实际应用中往往要复杂的多,比如spring框架在运用工厂模式的时候,但归根结底工厂模式主要是用来给我们的程序进行解耦,替我们去创建我们所需的对象。

工厂方法

  • 工厂方法一般用于简单的对象创建,下面简单的举一个工厂方法的代码实例

    所需的类

package com.dongzhu.cn.factory;

import com.dongzhu.cn.bean.HisSample;
import com.dongzhu.cn.bean.MySample;
import com.dongzhu.cn.port.Sample;
// 工厂方法类
public class Factory {

    public static Sample creator(int which){

        // ....
        if(which == 1){
            return new MySample();
        }else if(which == 2) {
            return new HisSample();
        }
        return null;
    }
}
// 主启动类
public class MainClass {

    public static void main(String[] args) {
        Sample sample = Factory.creator(1);
    }
}

其实在我们看来这样子做,基本上没什么用因为它还是强耦合的,但是却直观的帮我们重现工厂所帮
我们做的是,那就是创建对象,并且封装了创建实例的代码,以上是工厂方法的举例。

抽象工厂

  • 当我们所创建的对象种类越来越多,越来越复杂我们就得考虑去用抽象工厂,而非方法工厂,两个模式并没有很大的区别,区别就是创建对象的复杂度。
  • 例:

抽象工厂

public abstract class AbstractClass {

    public abstract Sample creator();

    public abstract Sample2 Creator2();
}

抽象工厂具体实现

工厂具体实现
public  class  Factory extends AbstractClass {


    @Override
    public Sample creator() {
        return null;
    }

    @Override
    public Sample2 Creator2() {
        return null;
    }
}
  • 以上就是抽象工厂与方法工厂的两个例子,看到目前我相信对工厂模式也有一个大概的认识了,但到目前为止两个例子貌似并没有什么实际的作用,这也可以理解毕竟目前是让你建立起工厂的概念,那么接下来就简单的写一个工厂在实际的运用中的例子

实际运用

  • 文件结构
    在这里插入图片描述
  • 工厂类
public class Factory {

    private static HashMap<String, Object> cacheMap = new HashMap();

    static {
        try {
            Properties properties = new Properties();
            InputStream inputStream = new FileInputStream("resource/application.properties");
            properties.load(inputStream);
            Enumeration<?> enumeration = properties.propertyNames();
            while (enumeration.hasMoreElements()) {
                String className = (String) enumeration.nextElement();
                String classPath = properties.getProperty(className);
                Class<?> temp = Class.forName(classPath);
                Object object = temp.newInstance();
                cacheMap.put(className, object);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public static <T> T getInstance(String name) {
        return (T)cacheMap.get(name);
    }
}
  • 主启动类
public class MainClass {

    public static void main(String[] args) {
        HisSample hisSample = Factory.<HisSample>getInstance("hisSample");
        System.out.println(hisSample);
    }
}
  • 以上就是基本的工厂在实际当中运用,这样就能大大减少程序的耦合,利用反射创建我们所需的类,就算我们删除了某些类也不会出现报错,只需要改动properties文件内容即可,是不是很方便,spring框架也是相同的思想,但是同时也要说一句spring框架内部实现比我所写的小例子要大的多的多,要考虑的问题也要多的多的多。

声明:本章参考了patternInJava 书籍

猜你喜欢

转载自blog.csdn.net/qq_37025563/article/details/86475473