对象创建与销毁的几种方式比较
我们在创建java对象的时候,往往是通过 new 的形式,实际上,结合不同的情况,直接new 的时候可能会带来较大的内存开销,因此我们可以采用静态工厂
如:
public class Person{
private Person(){}; //其实相当单例模式
public Person getInstancePerson(args..){
// ....
return new Person();
}
}
他所带来的好处有以下几点: 1, 可以减少内存开销,不必每一次都去new(在return之前 加上一些判断逻辑);
2 可以命名不同的方法名,以便区分;
3 另外可以加上一些逻辑的判断,判断是否要返回一个对象;
4 使用泛型的时候,直接返回父类所属,new的时候要写泛型...
但是这样一来,当有多个参数的时候,构造方法和静态工厂会相当凌乱,这是可以用builder模式来代替:
Builder 模式(引用自http://blog.csdn.net/lilu_leo/article/details/8214646 thanks!):
- 建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(Concrete Builder)角色。具体建造者类必须实现这个接口所要求的方法:一个是建造方法,另一个是结果返还方法。
- 具体建造者(Concrete Builder)角色:担任这个角色的是于应用程序紧密相关的类,它们在应用程序调用下创建产品实例。这个角色主要完成的任务包括:实现Builder角色提供的接口,一步一步完成创建产品实例的过程。在建造过程完成后,提供产品的实例。
- 指导者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。导演者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。
- 产品(Product)角色:产品便是建造中的复杂对象。指导者角色是于客户端打交道的角色。导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但却不为客户端所知。
代码示例
public abstract class Builder {
protected Food mFood = new Food();
public abstract void setFoodName(String name);
public abstract void setFoodTastes(String tastes);
public abstract void setFoodFeature(String feature);
public abstract void addSugar(String sugar);
public abstract void addSalt(String salt);
public abstract void addChillies(String chillies);
public Food getResult() {
return mFood;
}
}
实体Builder:
public class ShandongCuisineChefBuilder extends Builder{
@Override
public void setFoodName(String name) {
mFood.setFoodName(name);
}
@Override
public void setFoodTastes(String tastes) {
mFood.setFoodTastes(tastes);
}
@Override
public void setFoodFeature(String feature) {
mFood.setFoodFeatures(feature);
}
@Override
public void addSugar(String sugar) {
mFood.setSugar(sugar);
}
@Override
public void addSalt(String salt) {
mFood.setSalt(salt);
}
@Override
public void addChillies(String chilies) {
mFood.setChillies(chilies);
}
}
public class Director {
private Builder mBuilder;
public Director(){}
public Director(Builder builder) {
mBuilder = builder;
}
public void setDirector(Builder builder) {
mBuilder = builder;
}
public Food construct(String name, String feature, String tastes,
String chillies, String salt, String sugar) {
mBuilder.setFoodName(name);
mBuilder.setFoodFeature(feature);
mBuilder.setFoodTastes(tastes);
mBuilder.addChillies(chillies);
mBuilder.addSalt(salt);
mBuilder.addSugar(sugar);
return mBuilder.getResult();
}
}
client类:
经典鲁菜:
Food Name: 糖醋里脊
Food Feature: 色淡黄,形光润饱满.外松脆酥香,里软嫩鲜美
Food Tastes: 又甜又香
Food Chillies: 无
Food Salt: 适量
Food Sugar: 加糖
经典川菜:
Food Name: 水煮肉片
Food Feature: 肉味香辣,软嫩,易嚼
还算比较简单,不做过多解释了。
1. 建造者模式的优点
- 封装性
使用建造者模式可以使客户端不必知道产品内部组成的细节,如例子中我们就不需要关心每一个具体的模型内部是如何实现的,产生的对象类型就是CarModel。
- 建造者独立,容易扩展
Builder之间是相互独立的,与其它的Builder无关,对系统的扩展非常有利。
- 便于控制细节风险
模式所建造的最终产品更易于控制:由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
2. 建造者模式的使用场景
- 相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式,需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
- 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。
- 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式是非常合适。
- 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程。该种场景,只能是一个补偿方法,因为一个对象不容易获得,而在设计阶段竟然没有发觉,而要通过创建者模式柔化创建过程,本身已经违反设计最初目标。
3. 建造者模式的注意事项
建造者模式关注的是的零件类型和装配工艺(顺序),这是它与工厂方法模式最大不同的地方,虽然同为创建类模式,但是注重点不同。和其他模式的区别:
- 与抽象工厂模式相比,建造者模式返回一个组装好的完整产品,而抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族。
- 在抽象工厂模式中,客户端实例化工厂类,然后调用工厂方法获取所需产品对象,而在建造者模式中,客户端可以不直接调用建造者的相关方法,而是通过指挥者类来指导如何生成对象,包括对象的组装过程和建造步骤,它侧重于一步步构造一个复杂对象,返回一个完整的对象。
- 如果将抽象工厂模式看成汽车配件生产工厂,生产一个产品族的产品,那么建造者模式就是一个汽车组装工厂,通过对部件的组装可以返回一辆完整的汽车。