spring的两种设计模式:
1)单态模式:Spring 容器是实例化和管理全部bean 的工厂, Spring 默认将所有的bean 设置成单态模式,无须自己完成单态模式,即对所有相同id 的bean 请求都将返回同一个共享实例。因此,单态模式可大大降低Java 对象在创建和销毁时的系统开销。
更多的时候,为了提高性能,程序应尽量减少Java 对象的创建和销毁时的开销。使用单态模式可避免Java 类被多次实例化,让相同类的全部实例共享同一内存区。
package com.szlongtu.xz;
/**
* @author xz
*
*/
public class SingletonTest {
int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
private static SingletonTest instance;
private SingletonTest() {
System.out.println("正在执行构造器。。");
}
public static SingletonTest getInstance() {
if (instance == null) {
instance = new SingletonTest();
}
return instance;
}
public static void main(String[] arg) {
SingletonTest t1 = SingletonTest.getInstance();
SingletonTest t2 = SingletonTest.getInstance();
t2.setValue(9);
System.out.println(t1 == t2);
}
}
证明单态模式的全部实例是使用同一实例
2)工厂模式是根据调用数据返回某个类的一个实例,此类可以是多个类的某一个类。通常,这些类满足共同的规则(接口)或父类。调用者只关心工厂生产的实例是否满足某种规范,即实现的某个接口是否可供自己正常调用(调用者仅仅使用)。该模式给对象之间作出了清晰的角色划分,降低程序的棋合。
package com.szlongtu.xz;
public class American implements Person {
public String sayHello(String name) {
return name+",hello";
}
public String sayGoodBye(String name) {
return name+",goodBye";
}
}
package com.szlongtu.xz;
public class Chinese implements Person{
public String sayHello(String name) {
return name+",你好!";
}
public String sayGoodBye(String name) {
return name+",再见!";
}
}
package com.szlongtu.xz;
public class FactoryTest {
public static void main(String[] args) {
PersonFactory pf = new PersonFactory();
Person p = null;
p = pf.getPerson("chin");
System.out.println(p.sayHello("wawa"));
System.out.println(p.sayGoodBye("wawa"));
p = pf.getPerson("ame");
System.out.println(p.sayHello("wawa"));
System.out.println(p.sayGoodBye("wawa"));
}
}
package com.szlongtu.xz;
public interface Person {
public String sayHello(String name);
public String sayGoodBye(String name);
}
package com.szlongtu.xz;
public class PersonFactory {
public Person getPerson(String ethnic) {
if (ethnic.equalsIgnoreCase("chin")) {
return new Chinese();
} else {
return new American();
}
}
}
结果:
wawa,你好!
wawa,再见!
wawa,hello
wawa,goodBye
由此可看出,主程序从Person 接口的具体类中解耦出来,而且程序调用者无须关心Person 的实例化过程,主程序仅仅与工厂服务定位结合在一起,可获得所有工厂能产生的实例。具体类的变化,接口无须发生任何改变,调用者程序代码部分也无须发生任何改动。