设计模式-创建型模式(单例、简工、工方)

1.单例模式

确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。单例模式是一种对象创建模式。

1.1 饿汉式单例类

当类被加载时,静态变量instance被初始化,此时类的私有构造函数会被调用,单例类的唯一实例将被创建。但是不管用不用得到,这个实例都被创建,占用内存空间。
在这里插入图片描述
对应的Java片段:

class EagerSingleton{
	private static final EagerSingleton instance = new EagerSIngleton();
	private EagerSingleton() {}
	
	public static EagerSingleton getInstance(){
		return instance
	}
}

1.2 懒汉式单例类

带有双重检查锁定(Double-Check Locking)的懒汉式单例类。
在这里插入图片描述
对应的Java片段:

class LazySingleton{
	private volatile static LazySingleton instance = null;

	private LazySingleton() {}

	public static LazySingleton getInstance() {
		if (instance == null){
			synchronized (LazySingleton.class) {
				if (instance == null) {
					instance = new LazySingleton();
				}
			}
		}
		return instance;
	}
}

1.3 IoDH单例

结合前两种单例模式的优点。在实现IoDH时,需要在单例类中增加一个静态内部类,在该内部类中创建单例对象,再将该单例对象通过getInstance方法返回给外部使用。
对应的Java片段:

class Singleton{
	private Singleton() {}

	private static class HolderClass {
		private final static Singleton instance = new SIngleton();
	}
	
	private static Singleton getInstance() {
		return HolderClass.instance;
	}
	
	public class void main(String args[]) {
		Singleton s1, s2;
		s1 = Singleton.getInstance();
		s2 = Singleton.getInstance();
		System.out.println(s1 == s2);
	}
}

结果必定是true。单例模式的适用场景:系统只需要一个实例对象;客户调用类的单个实例只允许适用一个公共访问点。

2.简单工厂模式

定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态方法,因此又称为静态工厂模式,属于类创建型模式。
工厂模式结构:
在这里插入图片描述
(1)Factory(工厂角色):即工厂类,模式的核心,负责创建所有产品实例的内部逻辑。工厂类可直接被外界调用,创建所需的产品对象。在类中提供了静态工厂方法factoryMethod(),返回类型为产品类型Product。
(2)Product(抽象产品角色):它是工厂类所创建的所有对象的父类,封装了各种产品对象的公有方法
(3)ConcreteProduct(具体产品角色):它是简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。每个具体产品角色都继承了抽象产品角色Product,需要实现在抽象产品中声明的抽象方法。
对应的Java片段:

abstract class Product {
	//调用所有产品类的公共业务方法
	public void methodSame(){
		//公共方法的实现	
	}
	//声明抽象业务方法
	public abstract void methodDiff();
}


class ConcreateProduct extends Product{
	//实现业务方法
	public void methodDiff(){
		//业务方法的实现
	}
}


class Factory{
	//静态工厂方法
	public static Product getProduct(String arg){
		Product product = null;
		if(arg.equalslgnoreCase("A")){
			product =  new ConcreateProductA();
		} 
		else if(arg.equalslgnoreCase("B")){
			product = new ConcreateProductB();
		}
		return product
	}
}

//客户端代码调用
class Client{
	public static void main(String arg){
		Product product;
		product = Factory.getFactory("A");
		product.methodSame();	
		product.methodDiff();
		}
}

3.工厂方法模式

定义一个用于创建对象的接口,让子类决定将那一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。工厂方法模式又称为工厂模式、虚拟构造器模式、多态工厂模式。
工厂方法模式结构:
在这里插入图片描述
在工厂模式结构图中包含以下4个角色:
(1)Product(抽象产品):它是定义产品的接口,是工厂方法模式所创建对象的超类型,也就是产品对象的公共父类。
(2)ConcreteProduct(具体产品):它实现了冲徐昂产品接口,某种类型的具体产品由专门的具体工厂创建,具体工厂和具体产品之间意义对应。
(3)Factory(抽象工厂):在抽象工厂类中,声明了工厂方法(Factory Method),用于返回同一个产品。抽象工厂是工厂方法模型的核心,所有创建对象的工厂类都必须实现该接口。
(4)ConcreteFactory(具体工厂):它是抽象工厂类的子类,实现了抽象工厂类中定义的工厂方法,并可由客户端调用,返回一个具体产品类的实例。
代码参考:https://github.com/Onecat-j/JavaProjects

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值