设计模式--单例模式&&工厂模式

 

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就是一个工厂类的具体示例

 

猜你喜欢

转载自change-jeans.iteye.com/blog/2183760