Java--工厂模式

设计模式:

是一套被反复使用,多数人知晓的,经过分类编目的,代码设计经验总结。

工厂模式:

实例化对象,用工厂方法代替new操作。

工厂模式包括工厂方法模式和抽象工厂模式

抽象工厂模式是工厂方法模式的扩展

意图:

定义一个接口来创建对象,但是让子类来决定那些类需要被实例化

工厂方法把实例化的工作推迟到子类中实现

什么时候适合工厂模式:

有一组类似的对象需要创建。

在编码是不能遇见需要创建那种类的实例

系统需要考虑扩张性,不依赖于产品类实例如何被创建

首先客户端需要创建多样的发型

package com.nyan.factory;
/**
 * client 
 * @author Administrator
 *
 */
public class HairTest {

    public static void main(String[] args) {
//        HairInterface  left = new LeftHair();
//        left.drow();
//        HairInterface  right = new RightHair();
//        right.drow();
        
        HairFactory factory = new HairFactory();
        factory.getHair("left").drow();
        factory.getHairByClass("com.nyan.factory.RightHair").drow();
        factory.getHairByClassKey("left").drow();
    }

}

通过工厂替客户端创建格式各类的发型:

package com.nyan.factory;

import java.util.Map;

/**
 * 发型工厂
 * @author Administrator
 *
 */
public class HairFactory {

    public HairInterface getHair(String key){
        if("left".equals(key)){
            return new LeftHair();
        }else if("right".equals(key)){
            return new RightHair();
        }
        return null;
    }
    /**
     * 利用反射,根据类名生成对象
     * @return
     */
    public HairInterface getHairByClass(String className){
        try {
            HairInterface hair = (HairInterface)Class.forName(className).newInstance();
            return hair;
        } catch (InstantiationException | IllegalAccessException
                | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    public HairInterface getHairByClassKey(String key){
        try {
            Map<String, String> map =new PropertiesReader().getProperties();
            HairInterface hair = (HairInterface)Class.forName(map.get(key)).newInstance();
            return hair;
        } catch (InstantiationException | IllegalAccessException
                | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}

利用抽象方法提供实现各种发型的类

package com.nyan.factory;
/**
 * 发型接口
 * @author Administrator
 *
 */
public interface HairInterface {
    public void drow();
}
package com.nyan.factory;

public class LeftHair implements HairInterface {

    @Override
    public void drow() {
        System.out.println("---左分发型---");
    }

}
RightHair、InHair。。。

利用配置文件实现类的映射

right=com.nyan.factory.RightHair
left=com.nyan.factory.LeftHair

读取配置文件:

package com.nyan.factory;

import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

public class PropertiesReader {

    public Map<String,String> getProperties(){
        Properties props = new Properties();
        Map<String,String> map = new HashMap<String, String>();
        InputStream in = getClass().getResourceAsStream("type.properties");
        try {
            props.load(in);
            Enumeration enumeration = props.propertyNames();
            while (enumeration.hasMoreElements()) {
                String key = (String) enumeration.nextElement();
                String value = props.getProperty(key);
                map.put(key, value);
            }
            return map;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
        
    }
    
}

 

原文地址:https://www.cnblogs.com/Nyan-Workflow-FC/p/6483218.html