常见的设计模式之工厂模式和单例模式

工厂模式

工厂方法模式有两个抽象类,一个是产品抽象类,一个是工厂抽象类,若干个具体产品类和对应的具体工厂类,具体产品抽象类与产品抽象类是实现关系,与具体工厂类是依赖关系,具体工厂类与抽象工厂类是实现关系。
工厂模式大概如图
客户端代码如下

在这里插入图片描述
工厂模式是定义一个用于创建对象的接口,让子类决定将哪一个类实例化,工厂方法模式使一个类的实例化延迟到其子类。
(工厂模式要写的类比较多,而且无法解决产品族的问题)

抽象工厂模式

抽象工厂的具体工厂不是只是创建一种产品,而是负责创建一族产品。
在这里插入图片描述

抽象工厂的结构包括
1,抽象工厂
2,具体工厂
3,抽象产品
4,具体产品

可以解决不同产品族的不同产品的问题。例如A公司的电视,电脑和B公司的电视电脑,有一个相同的抽象工厂。然后创建A公司和B公司的具体工厂,创建电视和电脑的抽象产品类,延伸出A公司的电视电脑,B公司的电视电脑,A公司的具体工厂类创建A公司的具体产品,B公司创建B公司的具体产品。
例如
在这里插入图片描述

客户端代码:

class Client
{	public static void main(String args[])
	{
		DBFactory factory; //抽象工厂
		Connection connection; //抽象产品
		Statement statement;  //抽象产品
		factory = new OracleFactory(); //指定具体工厂
		connection = factory.createConnection(); 
		statement = factory.createStatement();
		connection.connect();
		statement.executeStatement();
	}
}

单例模式

确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例。
在这里插入图片描述
私有构造方法,确保其他用户无法用New创建,模式中包含一个静态的私有成员变量和静态的公有的工厂方法,该工厂方法负责检验实例的存在性并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。

public class Singleton
{	private static Singleton instance=null;  //静态私有成员变量
	//私有构造函数
	private Singleton( )  {}
	
       //静态公有工厂方法,返回唯一实例
	public static Singleton getInstance()
	{
		if(instance==null)
		    instance=new Singleton();	
		return instance;
	}
}

单例模式分为饿汉模式和懒汉模式
饿汉模式:在自己被家在的时候就将自己初始化。
在这里插入图片描述
懒汉模式:在调用的时候才将自己初始化。
在这里插入图片描述

饿汉式单例与懒汉式单例类比较
饿汉式单例类在自己被加载时就将自己实例化。单从资源利用效率角度来讲,这个比懒汉式单例类稍差些。从速度和反应时间角度来讲,则比懒汉式单例类稍好些。
懒汉式单例类在实例化时,必须处理好在多个线程同时首次引用此类时的访问限制问题,特别是当单例类作为资源控制器,在实例化时必然涉及资源初始化,而资源初始化很有可能耗费大量时间,这意味着出现多线程同时首次引用此类的机率变得较大,需要通过同步化机制进行控制

猜你喜欢

转载自blog.csdn.net/Vi_sener/article/details/82785210