使用工厂设计模式的场景
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在添加或是删除数据的时候也是对存放元素的数组对象进行的锁定。
情况一:如果一个对象拥有很多子类,那么创建该对象的子类使用工厂模式是最合适的,不但可以面向接口的编程,为维护以及开发带来方便。
情况二:如果创建某个对象时需要进行许多额外的操作,如查询数据库然后将查询到的值赋予要创建的对象(单例初始化时使用比较多),或是需要许多额外的赋值等等。如果查看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在添加或是删除数据的时候也是对存放元素的数组对象进行的锁定。
相关文章推荐
- 使用工厂设计模式的场景
- Java技术_每天掌握一种设计模式(003)_使用场景及简单实例(创建型:工厂方法)
- Java技术_每天掌握一种设计模式(004)_使用场景及简单实例(创建型:抽象工厂)
- 领域驱动设计之工厂模式实现场景
- Java反射机制(五):使用反射增强简单工厂设计模式
- 设计模式-旧话重提之类工厂的使用
- 设计模式中的工厂模式使用
- Java设计模式编程之工厂方法模式的使用
- php中使用接口实现工厂设计模式的代码
- 使用单例和工厂设计模式实现dao实现层的解耦
- 设计模式笔记1 - 简单工厂 和 工厂模式理解以及使用
- 实例讲解Python设计模式编程之工厂方法模式的使用
- 使用C++实现设计模式(连载): 第二回 Factory 工厂模式
- [转载野猪的一篇文章] 设计模式--简单工厂模式在unity3d里面的使用
- 反射机制和工厂设计模式结合使用
- 设计模式(1)-使用简单工厂优化代码
- Java反射机制(五):使用反射增强简单工厂设计模式
- Java技术_每天掌握一种设计模式(006)_使用场景及简单实例(创建型:原型模式)
- 实例解析C#设计模式编程中简单工厂模式的使用
- 设计模式实例学习-单例模式(Android中的使用场景)