设计方式之简单工厂模式(一)
设计模式之简单工厂模式(一)
简单工厂也叫静态工厂:涉及到工厂角色,抽象产品,以及具体产品角色等。
一般情况下就是根据参数数据返回一个适当的子类,然后用抽象基类或接口引用具体的对象,而不用考虑该实际对象的产生过程.
下面来看一个例子:
简单工厂模式不满足OCP,OCP原则的基本思想是对于扩展是开放的,对于更改是封闭的,该原则在java中的实现是通过接口完成的。可是在具体操作中功能的扩展是一定会出现变化的,这样怎么是对更改是封闭的呢?
举个例子:假如现在要增加一个新类型的车 B 类,那么就要更改factory工厂类添加多一行new B();的代码,所以可以看出,简单工厂模式是不满足OCP的。
针对这种情况是不是可以用下面的方式来改进下。。。。用到了java的反射
不知道这样理解对不对,请多多拍砖指正。
简单工厂也叫静态工厂:涉及到工厂角色,抽象产品,以及具体产品角色等。
一般情况下就是根据参数数据返回一个适当的子类,然后用抽象基类或接口引用具体的对象,而不用考虑该实际对象的产生过程.
下面来看一个例子:
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("造不了这种汽车。。。"); } } }
不知道这样理解对不对,请多多拍砖指正。