1.单例模式
public class Singleton {
private static Singleton instance;
//外界不能直接访问
private Singleton() {
}
//static 直接通过类名去访问该方法
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
public class TestSingleton {
public static void main(String[] args) {
Singleton insSingleton1 = Singleton.getInstance();
Singleton insSingleton2 = Singleton.getInstance();
System.out.println(insSingleton1 == insSingleton2);
}
}
单例模式的优势:
1.减少创建java实例带来的系统开销
2.便于系统跟踪单个java实例的生命周期、实例状态等
什么时候使用单例模式?
某个类在整个工程中只需要一个实例,就可以用单例模式。比如你的工程需要读取配置文件,一般情况下你会写个配置文件的类,而这个类在整个工程里只需要new一次,所有调用者都是用同一个实例,那么这个类就可以采用单例模式。
再比如一些管理器的类都是单例的,所有跟管理有关的操做都要调用管理器来进行,管理器不能出现多个,所以要单例,避免管理混乱。
注意:在项目中如果有很大的并发量的情况下,有可能造成同时又多个程序执行这个类实例化的方法,因此我们需要在创建类实例化方法的时候添加同步执行.
Spring框架,可以在配置Bean实例时,指定scope="singleton"来配置单例模式,默认是单例模式。
2.工厂模式
接口
public interface Output {
void out();
}
两个实现类:
public class Printer implements Output {
public void out() {
System.out.println("普通打印机输出");
}
}
public class BetterPrinter implements Output {
public void out() {
System.out.println("高级打印机输出");
}
}
工厂类
public class OutputFactory {
public static Output getOutput(String type) {
if (type.equalsIgnoreCase("better")) {
return new BetterPrinter();
} else {
return new Printer();
}
}
}
业务逻辑类
// Computer类对接口Output形成依赖,将Computer与Printer实现类分离开来
public class Computer {
//与接口关联,不与具体的实现类关联
private Output out;
public Computer(Output out) {
this.out = out;
}
public void print() {
out.out();
}
}
客户端调用
public static void main(String[] args) {
OutputFactory factory = new OutputFactory();
// Output output = factory.getOutput("normal");
Output output = factory.getOutput("better");
Computer c = new Computer(output);
c.print();
}
工厂模式的优势:统一管理对象的创建过程,客户端可以免去产品创建的责任,减小了代码的耦合度
工厂类提供多种方案,应对客户端的各种“需求”。
如果有许多地方都需要生成A的对象,那么你需要写很多A a=new A()。
如果需要修改的话,你要修改许多地方。
但是如果用工厂模式,你只需要修改工厂代码。其他地方引用工厂,可以做到只修改一个地方,
其他代码都不动,就是解耦了。
spring就是一个工厂类的具体示例