设计模式-工厂模式

1.定义

工厂模式属于设计模式中的创建型模式,在工厂模式中,创建对象不暴露创建逻辑(你只需要去4s店买你想要的车型,而不需要知道这辆车如何建造的),而是通过使用一个共同的接口来指向新创建的对象。

创建型模式
这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。引用菜鸟教程

2.代码实现

可以用之前的反射提到的i18n 国际化的例子

I18N interface

package com.imooc.i18n;

public interface I18N {
    public String say();
}

两个实现类

En.java

package com.imooc.i18n;

public class En implements I18N{
    @Override
    public String say() {
        return "Struggle for your life";
    }
}

Zhcn.java

package com.imooc.i18n;

public class En implements I18N{
    @Override
    public String say() {
        return "Struggle for your life";
    }
}

工厂类

package com.imooc.i18n;

public class I18NFactory {
    public I18N getLanguage(String language){
        if(language == null)
            return null;
        if(language.equalsIgnoreCase("English"))
            return new En();
        else if(language.equalsIgnoreCase("Chinese"))
            return new Zhcn();
        return null;
    }
}

客户类

package com.imooc.i18n;

public class ApplicaitonZero {
    public static void main(String[] args) {
        I18NFactory i18NFactory = new I18NFactory();
        I18N EnglishVersion = i18NFactory.getLanguage("English");
        System.out.println(EnglishVersion.say());

        I18N ChineseVersion = i18NFactory.getLanguage("Chinese");
        System.out.println(ChineseVersion.say());

    }
}

当然也可以用反射技术,使用配置文件的方式动态创建对象

config.properties

language=com.imooc.i18n.En
package com.imooc.i18n;

import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLDecoder;
import java.util.Properties;

public class Application {
    public static void say(){
        Properties properties = new Properties();
        String configPath = Application.class.getResource("/config.properties").getPath();
        try {
            configPath = new URLDecoder().decode(configPath,"UTF-8");
            properties.load(new FileInputStream(configPath));
            String language = properties.getProperty("language");
            I18N i18n = (I18N)Class.forName(language).newInstance();
            System.out.println(i18n.say());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Application.say();
    }
}

这种模式在使用XML进行配置的框架中大量应用,如 MyBatis Spring

posted @ 2021-04-13 21:35  又一个蛇佬腔  阅读(62)  评论(0编辑  收藏  举报