设计方式之简单工厂模式(一)

设计模式之简单工厂模式(一)
简单工厂也叫静态工厂:涉及到工厂角色,抽象产品,以及具体产品角色等。
一般情况下就是根据参数数据返回一个适当的子类,然后用抽象基类或接口引用具体的对象,而不用考虑该实际对象的产生过程.
下面来看一个例子:
interface Car{
    public void run();
    public void stop();
}

class Benz implements Car{
    public void run(){
        System.out.println("Benz run。。。。。");
    }
    public void stop(){
        System.out.println("Benz stop。。。。。");
    }
}

class Ford implements Car{
    public void run(){
        System.out.println("Ford run。。。");
    }
    public void stop(){
        System.out.println("Ford stop。。。。");
    }
}

class Toyota implements Car{
    public void run(){
        System.out.println("Toyota run。。。");
    }
    public void stop(){
        System.out.println("Toyota stop。。。。");
    }
}

class Factory{
    public static Car getCarInstance(String type){
        Car c=null;
        try {
        	if("".equals(type))
        		c = new Toyota();
        	else if("".equals(type))
        		c = new Ford();
        	else if("".equals(type))
        		c = new Benz();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return c;
    }
}
class FactoryDemo {
    public static void main(String[] args) {
        Car c=Factory.getCarInstance("Toyota");
        if(c!=null){
            c.run();
            c.stop();
        }else{
            System.out.println("造不了这种汽车。。。");
        }
    }
}


简单工厂模式不满足OCP,OCP原则的基本思想是对于扩展是开放的,对于更改是封闭的,该原则在java中的实现是通过接口完成的。可是在具体操作中功能的扩展是一定会出现变化的,这样怎么是对更改是封闭的呢?

举个例子:假如现在要增加一个新类型的车 B 类,那么就要更改factory工厂类添加多一行new B();的代码,所以可以看出,简单工厂模式是不满足OCP的。

针对这种情况是不是可以用下面的方式来改进下。。。。用到了java的反射
class Factory{
    public static Car getCarInstance(String type){
        Car c=null;
        try {
            c=(Car)Class.forName("com.tink.factory."+type).newInstance();//利用反射得到汽车类型 
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return c;
    }
}
class FactoryDemo {
    public static void main(String[] args) {
        Car c=Factory.getCarInstance("Toyota");
        if(c!=null){
            c.run();
            c.stop();
        }else{
            System.out.println("造不了这种汽车。。。");
        }
    }
}


不知道这样理解对不对,请多多拍砖指正。