第三章 【创建型设计模式】

模式: 模式描述的是具有代表性的重复性问题及其解答方案.


模式分类:

1)架构模式:架构是指一个软件系统整体的组织结构。架构模式描述软件系统的组织结构的一些规则和指南。

2)设计模式:设计模式描述的是在软件系统的某一局部不断重现的核心解决方案,这种解决方案以完善的设计结构出现,可以被应用到以后出现的类似的环境中。


设计模式的分类:

1)创建模式: 涉及对象的创建 (单例模式, 工厂模式, 建造者模式,原型模式)

2)结构模式:涉及类和对象的组合(Facade外观模式, 代理模式, 适配器模式, 装饰模式)

3)行为模式: 刻画了类和对象交换及分配职责的方式.主要目标是解耦(察者模式, 命令模式, 模板模式,策略模式)


工厂模式Factory:将对象的创建和对象的使用分开进行,这样可以减少类与类之间的耦合度


package com.lovo.factory;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class Factory {
	private static Properties pro = new Properties();
	static{
		InputStream in = Factory.class.getResourceAsStream("/tool.txt");
		try {
			pro.load(in);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 更具键,得到改键对应值得对象
	 * @param key
	 * @return
	 */
	public static ITool getTool(String key){
		String path = pro.getProperty(key);
		
		try {
			//加载类,得到全路劲
			Class c = Class.forName(path);
			//产生该类对象
			Object obj = c.newInstance();
			return (ITool)obj;
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return null;
	}
}



单例模式Singleton:

1)立即加载

<pre name="code" class="java">//立即加载(预加载)
	private Man(){};
	private static Man m = new Man();
	
	public static Man getMan(){
		return m;
	}


 
 

2)支持高并发延迟加载

<pre name="code" class="java">	//支持高并发延迟加载
	private Man(){};
	private static Man m;
	public static Man getMan(){
		if(m==null){
			synchronized(Man.class){
				if(m==null){
					m = new Man();
				}
			}
		}
		
		return m;
	}


 

原形模式:通过复制和克隆的方式创建对象,这样无需知道创建对象的细节

浅度克隆:如果克隆对象有引用类型的属性,则和原对象引用类型的属性,指向同一个对象

	public Object clone(){
		Object obj =null;
		
		try {
			obj = super.clone();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return obj;
	}

深度克隆:克隆对象的引用类型的属性和原对象引用类型的属性,指向不同的对象,也就是本身对象克隆,引用类型指向的对象也克隆

/**
	 * 深度克隆
	 * @return
	 */
	public Student deepClone(){
		//创建内存写入流
		ByteArrayOutputStream bo = new ByteArrayOutputStream();
		ObjectOutputStream objOut = null;
		
		ByteArrayInputStream bi = null;
		ObjectInputStream objIn = null;
		
		try {
			objOut = new ObjectOutputStream(bo);
			//将当前对象数据写入到指定内存中
			objOut.writeObject(this);
			
			//建立内存读取流,读取之前写入内存的数据
			bi = new ByteArrayInputStream(bo.toByteArray());
			objIn = new ObjectInputStream(bi);
			
			Object obj = objIn.readObject();
			
			return (Student)obj;
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				objIn.close();
				bi.close();
				objOut.close();
				bo.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		return null;
	}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值