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

(三)单例模式

单例模式应该是最常见的设计模式,作用是保证在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 关键字加在方法上还是对象上,它取得的锁都是对象,而不是吧一段代码或函数当作锁。

单例模式是为了保证类只有一个实例,并为类提供全局访问点,单例模式最富盛名,但是最容易误用,不要让它成为创建全局变量的花哨方法。类应该只需要知道与它协作的对象,不必了解创建它需要的限制。单例模式一定要记住隐藏构造函数,也就是在类里面写一个
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);

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

时间: 2024-12-22 09:14:27

java设计模式(二)单例模式 建造者模式的相关文章

Java设计模式百例 - 建造者模式

本文源码见:https://github.com/get-set/get-designpatterns/tree/master/builder 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象,这种类型的设计模式属于创建型模式.建造模式可以将一个复杂对象的内部组成部分,与该对象本身的创建分离开来,从而使得复杂对象的组装更灵活. 文绉绉的话不宜多说,其实这种模式还是挺常见的: * 比如我们在订手机套餐的时候,无论是自选还是电信公司配置好的,通常一个套餐包括

Java设计模式14:建造者模式

什么是建造者模式 发现很多框架的源码使用了建造者模式,看了一下觉得挺实用的,就写篇文章学习一下,顺便分享给大家. 建造者模式是什么呢?用一句话概括就是建造者模式的目的是为了分离对象的属性与创建过程,是的,只要记住并理解红字的几个部分,建造者模式你就懂了. 为什么需要建造者模式 建造者模式是构造方法的一种替代方案,为什么需要建造者模式,我们可以想,假设有一个对象里面有20个属性: 属性1 属性2 ... 属性20 对开发者来说这不是疯了,也就是说我要去使用这个对象,我得去了解每个属性的含义,然后在

Java设计模式之(建造者模式)

建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式通常包括下面几个角色: 1. builder:抽象建造者,给出一个抽象接口,以规范产品对象的各个组成成分的建造.这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建.2. ConcreteBuilder:建造者,实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建. 在建造过程完成后,提供产品的实例.3. Director:导演类,调用具体建造者来创建复杂

Java设计模式(二) 之 迭代器模式

源码均以JDK1.8作为参考 1.定义: Iterator提供一种方法访问一个容器对象中各个元素,而又不需要暴露对象的内部细节. 2.解析: 通用类图: 类图解析: 2.1.Iterator抽象迭代器 抽象迭代器负责定义通用的接口约定,基本都是基于JDK中Iterator接口的定义,源码如下: public interface Iterator<E> { boolean hasNext(); E next(); default void remove() { throw new Unsuppo

(九)JAVA设计模式之单例模式

JAVA设计模式之单例模式 一.单例模式的介绍 Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点.     全局对象和Singleton模式有本质的区别,因为大量使用全局对象会使得程序质量降低,而且有些编程语言根本不支持全局变量.最重要的是传统的全局对象并不能阻止一个类被实例化多次. 二.单例模式的特点 单例类只能有一个实例 单例类必须自己创建自己的唯一实例. 单例类必须给所有其他对象提供这一实例.

java 设计模式之单例模式

--------2015-11-20 14:45:10 java设计模式之单例模式(Singleton): ---应用场合:只需要一个对象就可以了,例如一个朝代一个皇帝. ---作用:保证某个应用程序中某个实例有且只有一个.共同使用一个,节省资源. ---类型:饿汉模式,懒汉模式. 一.饿汉模式(类加载的时候就会实例化,线程安全) 1 package com.sun.singleton; 2 3 //饿汉模式 4 public class Singleton { 5 6 //将构造函数私有化,不

Java设计模式之工厂方法模式(转) 实现是抽象工厂?

Java设计模式之工厂方法模式 责任编辑:覃里作者:Java研究组织   2009-02-25   来源:IT168网站 文本Tag: 设计模式 Java [IT168 技术文章]          一 .工厂方法(Factory Method)模式 工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色

java设计模式4--建造者模式(Builder)

本文地址:http://www.cnblogs.com/archimedes/p/java-builder-pattern.html,转载请注明源地址. 建造者模式 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 概述 当系统准备为用户提供一个内部结构复杂的对象时,就可以使用生成器模式,使用该模式可以逐步地构造对象,使得对象的创建更具弹性.生成器模式的关键是将一个包含有多个组件对象的创建分成若干个步骤,并将这些步骤封装在一个称作生成器的接口中. 适用性 1.当创建复杂

设计模式学习04—建造者模式

一.动机与定义 创建对象时,我们知道可以使用工厂方式来创建,使调用者和具体实现解耦,但是有一种情况,当要创建的多个对象之间重复性较大,只有创建步骤.组装顺序或者内部构件不同时,工厂模式就需要进一步的演化了,如我们去KFC,有很多种套餐,比如套餐1(薯条+可乐+汉堡),套餐2(鸡肉卷+薯条+可乐),这个套餐就是我们要获取的复杂对象,那么程序如何创建出这种对象呢. 我们看到套餐的内容很多是一样的,那么我们是不是可以考虑将创建单个食品(如鸡肉卷.可乐等)方法提取出来,使用单独一个类协调这些食品的组合比