模式: 模式描述的是具有代表性的重复性问题及其解答方案.
模式分类:
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;
}