java设计模式(二)单例模式 建造者模式

本文详细介绍了单例模式和建造者模式的概念及其应用场景。单例模式确保一个类只有一个实例,有效降低系统开销并简化核心代码管理。建造者模式则通过分离对象构建与表示,简化了复杂对象的创建过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(三)单例模式

单例模式应该是最常见的设计模式,作用是保证在JVM中,该对象仅仅有一个实例存在。

长处:1、降低某些创建比較频繁的或者比較大型的对象的系统开销。

    2、省去了new操作符,减少系统内存使用频率,减轻GC压力。

    3、保证核心代码的唯一性,比方交易引擎。

单例模式看似是最简单的设计模式。

public class Singleton {
	//私有构造方法,防止实例化
	private Singleton(){
		
	}
	//创建类的实例的时候载入
	private static Factory factory = new Factory();
	//延迟载入
	private static Factory factory1;
	public static Factory getInstans(){
		if(factory1 == null){
			factory1 = new Factory();
		}
		return factory1;
	}
}

上面是比較常见的单例模式的写法,后一种延迟载入应该是实际应用中使用比較多的方式,可是这样的载入方式假设在多线程模式下就有可能出现故障。对于多线程的处理,第一个想到的就是 synchronized 线程锁。

private static Factory factory;
	private static Object classlock = Singleton.class;
	public static Factory getInstances(){
		synchronized (classlock) {
			if(factory == null){
				factory = new Factory();
			}
			return factory;
		}
	}
	public static Factory getInstance(){
		if(factory == null){
			syncInit();
		}
		return factory;
	}
	private static synchronized void syncInit(){
		if(factory == null){
			factory = new Factory();
		}
	}
以上是两种线程锁的方法,第一种是对象锁,可是由于每次调用都须要加锁,性能会有部分损失。另外一种是方法锁。可是实际上,不管 synchronized keyword加在方法上还是对象上,它取得的锁都是对象,而不是吧一段代码或函数当作锁。

单例模式是为了保证类仅仅有一个实例,并为类提供全局訪问点,单例模式最富盛名,可是最easy误用,不要让它成为创建全局变量的花哨方法。类应该仅仅须要知道与它协作的对象,不必了解创建它须要的限制。单例模式一定要记住隐藏构造函数,也就是在类里面写一个 private 的构造函数。
(四)建造者模式

建造者模式的意图是将类的构建逻辑转移到类的实例化外部。建造者模式比抽象工厂模式又复杂一点,抽象工厂有一个 Factory 如今多一个工厂的主管 Director 他来管理工厂的生产过程。

interface Builder { 
	void buildPartA(); 
	void buildPartB(); 
	void buildPartC(); 
	Product getResult(); 
} 
interface Product { }
interface Part { }
class Car implements Product{
	private String door;
	private String windows;
	public String getDoor() {
		return door;
	}
	public void setDoor(String door) {
		this.door = door;
	}
	public String getWindows() {
		return windows;
	}
	public void setWindows(String windows) {
		this.windows = windows;
	}
}
//详细建造工具
class ConcreteBuilder implements Builder { 
	Part partA, partB, partC; 
	private static Car product = new Car();
	public void buildPartA() {
		//这里是详细怎样构建partA的代码
		product.setDoor("铁的");
	}; 
	public void buildPartB() { 
		//这里是详细怎样构建partB的代码
		product.setWindows("玻璃的");
	}; 
	public void buildPartC() { 
		//这里是详细怎样构建partB的代码
	}; 
	public Product getResult() {
		return product; 
		//返回最后组装成品结果
	}; 
}
//详细建造工具
class ConcreteBuilder2 implements Builder { 
	Part partA, partB, partC; 
	private static Car product = new Car();
	public void buildPartA() {
		//这里是详细怎样构建partA的代码
		product.setDoor("木头的");
	}; 
	public void buildPartB() { 
		//这里是详细怎样构建partB的代码
		product.setWindows("玻璃的");
	}; 
	public void buildPartC() { 
		//这里是详细怎样构建partB的代码
	}; 
	public Product getResult() {
		return product; 
		//返回最后组装成品结果
	}; 
}
//建造者
class Director {
	private Builder builder; 
	public Director( Builder builder ) { 
		this.builder = builder; 
	} 
	public void construct() { 
		builder.buildPartA();
		builder.buildPartB();
		builder.buildPartC(); 
	} 
} 
public class BuilderPattern {
	public static void main(String[] args){
		//获得详细的工厂
		ConcreteBuilder2 builder = new ConcreteBuilder2();
		//将工厂给管理者
		Director director = new Director( builder ); 
		//管理者构造出产品
		director.construct();
		//在工厂取得产品
		Car product = (Car) builder.getResult();
		System.out.println(product.getDoor());
	}
}
不同的工厂就会生产出不同的产品,可是生产什么产品是管理者决定的,假如管理者的
construct
不生产门了,那么终于的产品也就没有门了。

建造者模式能够控制中间的生产过程,比方读取 xml 时候用来推断某个值是否有数据。或者拼装 sql 语句的时候

SqlString sql = new SqlString();
        if(forUpdate) {
            sql.selectForUpdate(db);
        } else {
            sql.select(db);
        }
        sql.from(db).where().eq(db);





转载于:https://www.cnblogs.com/mengfanrong/p/3844403.html

内容概要:本文针对国内加密货币市场预测研究较少的现状,采用BP神经网络构建了CCi30指数预测模型。研究选取2018年3月1日至2019年3月26日共391天的数据作为样本,通过“试凑法”确定最优隐结点数目,建立三层BP神经网络模型对CCi30指数收盘价进行预测。论文详细介绍了数据预处理、模型构建、训练及评估过程,包括数据归一化、特征工程、模型架构设计(如输入层、隐藏层、输出层)、模型编译与训练、模型评估(如RMSE、MAE计算)以及结果可视化。研究表明,该模型在短期内能较准确地预测指数变化趋势。此外,文章还讨论了隐层节点数的优化方法及其对预测性能的影响,并提出了若干改进建议,如引入更多技术指标、优化模型架构、尝试其他时序模型等。 适合人群:对加密货币市场预测感兴趣的研究人员、投资者及具备一定编程基础的数据分析师。 使用场景及目标:①为加密货币市场投资者提供一种新的预测工具和方法;②帮助研究人员理解BP神经网络在时间序列预测中的应用;③为后续研究提供改进方向,如数据增强、模型优化、特征工程等。 其他说明:尽管该模型在短期内表现出良好的预测性能,但仍存在一定局限性,如样本量较小、未考虑外部因素影响等。因此,在实际应用中需谨慎对待模型预测结果,并结合其他分析工具共同决策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值