您的位置:首页 > 其它

使用工厂设计模式的场景

2017-05-04 17:47 253 查看
创建类对象虽然可以使用new(底层也是通过反射创建对象的),但是在一些情况下使用工厂模式确实最合适的。

情况一:如果一个对象拥有很多子类,那么创建该对象的子类使用工厂模式是最合适的,不但可以面向接口的编程,为维护以及开发带来方便。

情况二:如果创建某个对象时需要进行许多额外的操作,如查询数据库然后将查询到的值赋予要创建的对象(单例初始化时使用比较多),或是需要许多额外的赋值等等。如果查看JDK源码中,会发现许多成员变量在对象构造时,通过工厂方法进行创建的。因为这些成员变量本身的创建也很复杂。不可能创建对象时,在该对象的构造方法里创建成员变量然后再赋值给该成员变量。而且使用工厂模式也提高了代码的重用性。

如果创建对象时只需要对简单的成员变量可以直接通过构造方法传入即可。

面向对象设计思想就是分派和分装。即将长代码分派分隔成段,然后对每段进行封装。这样如果需要修改只修改每段即可,而不会牵一发而动全身。一定不要将多个鸡蛋放到一个篮子里面。

工厂模式分为工厂方法(factory method)和抽象工厂(abstract factory)

区别在于被创建对象的负责程度。

如果相关联的产品只有一个,那么不需要对工厂对象进行抽象了。使用工厂方法就可以了(即返回对象,根据传入的值然后生成不同的子类)。

如果关联的产品有多个,可以将工厂类进行抽象。让具体创建业务相关类的工作交给子类实现。如工厂子类1创建产品a的x业务对象和产品b的x业务对象,工厂子类2创建产品a的y业务对象和产品b的y业务对象.这样就实现了创建对象的垂直切断(这种方式是以业务为主导的)。

使用抽象工厂时,通常创建产品a和创建产品b的方法有一定的联系,因此才将两个对象捆绑在一起,作为抽象工厂的主导元素。

实际开发中,工厂模式使用比较多,并且和动态类装作器结合到一起也是非常多。

如Jlive就是这样实现。

//这里假如生成的对象就是该类本身,借助单例模式

public class FactoryMethod{

private static FactoryMethod instance = null;

private static Object lock = new Object();//因为使用懒汉式,这里生产一个对象锁

String className = “com.xxx.FactoryMethod”;

public FactoryMethod getInstance(xxxx yyy){//yyy可以是传入的条件

if(instance == null){

synchronized(lock){

instance = (FactoryMethod)Class.forName (className).newInstance();

return instance;

}

}

return instance;

}

}

注意对象锁使用非常多,例如ConcrentHashMap在添加或是删除数据的时候也是对存放元素的数组对象进行的锁定。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: