• 创建型模式-工厂模式


    工厂模式的意图:

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

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

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

    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

      

  • 相关阅读:
    C++中struct和class的区别
    关于LBP特征等价模式的解释
    常用的颜色模型
    flask类装饰器
    flask的方法视图
    flask standrad class 使用
    flask add_url_rule的使用
    模板的继承
    模板变量设置 set 和 with
    模版include的用法
  • 原文地址:https://www.cnblogs.com/zht0915/p/4638666.html
Copyright © 2020-2023  润新知