美文网首页
设计模式-001-工厂模式

设计模式-001-工厂模式

作者: 井易安 | 来源:发表于2018-04-24 14:08 被阅读0次

    概念
    是一种创建型模式,提供了一种创建对象的最佳方式。在工程模式中,我们在创建对象时不会对客户端暴露创建逻辑,而是通过使用一个共同的接口来指向新创建的对象。
    用工厂方法代替new操作
    工厂模式包括工厂方法模式和抽象工工厂模式
    抽象工厂模式是工厂方法模式的拓展

    工厂模式的意图
    定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工程模式让对象创建过程延迟到子类进行

    使用方向
    我们不必知道对象应该怎么实例化,只用关心通过工厂我们能够获得我们需要的实例。
    优点

    1. 如果我们要创建一个对象,只用知道这个类的名字即可,
    2. 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以了
    3. 屏蔽了产品的具体实现细节,调用者只用关心产品的接口

    具体实现

    //创建一个接口
    package com.factory;
    
    public interface Car {
        void run();
    }
    
    

    创建接口实现的实体类

    
    package com.factory;
    
    public class Car1 implements Car{
    
        @Override
        public void run() {
            // TODO Auto-generated method stub
            System.out.println("Car1 is running");
        }
    
    }
    
    
    package com.factory;
    
    public class Car2 implements Car{
    
        @Override
        public void run() {
            // TODO Auto-generated method stub
            System.out.println("Car2 is running");
        }
    
    }
    
    

    创建一个带反射和类名映射的工厂生成给定类信息的实体类的对象

    package com.factory;
    
    import java.io.IOException;
    import java.util.Map;
    
    public class CarFactory {
        public Car getCarByClassKey(String key){
            try {
                Map<String,String> map = new PropertiesReader().getProperties();
                Car car = (Car) Class.forName(map.get(key)).newInstance();
                return car;
                
            } catch (IOException | InstantiationException | IllegalAccessException | ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }
    }
    
    

    创建一个配置文件读取器,读取配置信息

    package com.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() throws IOException{
            Properties prop = new Properties();
            Map<String,String> map = new HashMap<String,String>();
            InputStream in = getClass().getResourceAsStream("type.properties");
            prop.load(in);
            Enumeration en = prop.propertyNames();
            while(en.hasMoreElements()){
                String key = (String) en.nextElement();
                String value = prop.getProperty(key);
                map.put(key, value);
            }
            return map;
            
        }
    }
    
    

    创建测试类

    package com.factory;
    
    public class Test {
        public static void main(String[] args) {
            CarFactory carFactory = new CarFactory();
            Car car1 = carFactory.getCarByClassKey("car1");
            Car car2 = carFactory.getCarByClassKey("car2");
            car1.run();
            car2.run();
        }
    }
    
    

    配置文件中的信息

    car1=com.factory.Car1
    car2=com.factory.Car2
    

    以上是一个完整的工厂模式的的例子,把创建对象的过程完全交给工厂类去实现,如果想加入更多的car只用在配置文件中添加对应信息即可,但是每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这就是工厂模式的缺点所在了。

    相关文章

      网友评论

          本文标题:设计模式-001-工厂模式

          本文链接:https://www.haomeiwen.com/subject/vuhjlftx.html