创建型模式-工厂模式

工厂模式的意图:

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

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

什么情况下适合工产模式;

1.有一组类似的对象需要创建;

2.在编码时不能预见需要创建哪种类的实例

3系统需要考虑扩展性,不应依赖产品类实例如何被创建,组合和表达的细节;(会有新的需求);

项目的现状:

在软件系统中经常面临着“对象”的创建工作。,,由于需求的变化,这个对象可能会随之变化,但它却拥有比较稳定的接口;

为此,我们需要提供一种封装机制来隔离出这个易变对象的变化,从而保持系统中其他依赖该对象的对象不随着需求变化而变化。

基于项目现状将代码进行如下设计:

1.尽量松耦合,一个对象的依赖对象的变化与本身无关,

2,具体产品与客户端剥离,责任分割;

       

代码的实现如下:

HairIntenface.java

1 package ff;
2 /*
3  * 创建一个接口来实现发型这一系列的产品;
4  * 
5  * */
6 public interface HairInterface {
7     public void draw();
8 }
View Code

 LeftHair.java

 1 package ff;
 2 
 3 public class LeftHair implements HairInterface {
 4     /*
 5     *
 6     *生产了一个左偏分发型;
 7     */
 8     @Override
 9     public void draw() {
10          System.out.println("----------左偏分发型-----------");
11 
12     }
13 
14 }
View Code

RightHair.java

 1 package ff;
 2 
 3 public class RightHair implements HairInterface {
 4      /*
 5     *
 6     *画了一个右偏分发型;
 7     */
 8     @Override
 9     public void draw() {
10         // TODO Auto-generated method stub
11          System.out.println("----------右偏分发型-----------");
12     }
13 
14 }
View Code

 PropertiesReader.java

package ff;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * properties文件的读取工具
 * @author Administrator
 *
 */
public class PropertiesReader {

    
    public Map<String, String> getProperties() {

        Properties props = new Properties();
        Map<String, String> map = new HashMap<String, String>();
        try {

            InputStream in = getClass().getResourceAsStream("type.properties");
            props.load(in);
            Enumeration en = props.propertyNames();
            while (en.hasMoreElements()) {
                String key = (String) en.nextElement();
                String property = props.getProperty(key);
                map.put(key, property);
//                System.out.println(key + "  " + property);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }
}
View Code

在包下创建一个type.properties

left=ff.LeftHair
right=ff.RightHair  

写上以上内容,这主要是根据参数找到相对应类的路径;

Hairfactory.java

package ff;

import java.util.Map;


public class Hairfactory {
    public HairInterface getHair(String key){
        if(key.equals("left")){
            return new LeftHair();
        }else if(key.equals("right")){
            return new RightHair();
        }else{
            return null;
        }
    }
    /*根据类的名称来创建对象*/
    public HairInterface getHairByClass(String className){
        
        try {
            HairInterface hair = (HairInterface) Class.forName(className).newInstance();
            return hair;
        } catch (InstantiationException e) {
            
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            
            e.printStackTrace();
        }
        return null;
        
        
    }
    /*根据传递过来的参数,来调用相应的类;写一个key value 相对应的类*/
    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 e) {
            
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            
            e.printStackTrace();
        }
        return null;
        
        
    }
}
View Code

test.java

package ff;

public class test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // 这是最原始的调用方法;
        //HairInterface left = new LeftHair();
        //left.draw();
        Hairfactory factory = new Hairfactory();
        //用参数来调用
        //HairInterface left = factory.getHair("left");
        //left.draw();
        //根据反射来调用类,实例化类
        //HairInterface left= factory.getHairByClass("ff.LeftHair");
        //left.draw();
        //在写类名很麻烦时,调用的参数
        HairInterface left= factory.getHairByClassKey("left");
        left.draw();
        
    }

}
View Code

  

原文地址:https://www.cnblogs.com/zht0915/p/4638666.html