zoukankan      html  css  js  c++  java
  • 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 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);





  • 相关阅读:
    视图结构 wxml 列表渲染 for
    表存在之设置默认值
    Oracle之根据约束名查找表
    java中String.indexOf()用法
    Idea之快捷键
    List<Map<String,Object>>之按照某个字段排序
    Oracle之mergeInto
    Oracle之根据字段查找表
    Mybatis之一级/二级缓存
    VueJs之前后端数据交互(使用Vue-resource实现)
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3844403.html
Copyright © 2011-2022 走看看