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

来源:互联网 发布:淘宝网今日特价女装 编辑:程序博客网 时间:2024/05/18 03:11

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


模式分类:

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