随笔分类 - Design Pattern
Java Singleton Implementation
摘要:概述Java中单例模式的实现有多重方法, 要实现单例模式主要的问题是线程安全问题以及对Lazy Load的考虑,主要有如下几种双重锁定懒加载单例预加载单例枚举单例双重锁定懒加载单例模式/** * 双重锁定懒加载单例实现 * * @author zhenwei.liu created on 2013 ...
阅读全文
建造者模式(Builder)
摘要:建造者模式是对象创建型设计模式之一,他主要用于构造复杂对象,而这个复杂对象则可以由多组不同的产品族构成,其结构原理图如下:其中关键部件有两个1. BuilderBuilder定义了生产复杂对象的组件的抽象接口(BuildPart)和获取这个复杂对象的方法(GetResult),但他自己本身并不装配对象,简言之Builder是生成复杂对象部件的接口提供者2. DirectorDirector定义了装配复杂对象的接口,它使用Builder提供的生产复杂对象组件的方法来生成组件,并将其装配起来,最后调用GetResult返回该复杂对象例子:ComponentBody组件族public abstrac
阅读全文
从原型模式(Prototype Pattern)到 Clone
摘要:前面提到抽象工厂的实现,这里说说抽象工厂的原型实现,与工厂方法的实现不同,原型实现有他自己的优点和缺点原型的优点:1. 效率:clone是native方法,比new的效率高,当使用复杂循环嵌套对象是尤为明显2. 不需要为每一个新增的product创造一个具体factory缺点:1. 如果需要深复制,则需要手写所有包含循环引用对象的类的clone方法,因为需要手动在clone方法里对引用对象进行clone,否则是浅复制2. 当需要改变一个克隆实例内部的值时,由于clone方法是无参方法,只能在clone完以后手动调用改变值得方法,且如果这个值是一个类的引用,则克隆应该建立在深复制的前提下,否则会
阅读全文
抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)
摘要:在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实例化这个对象,好处就是客户端并不知道这个实例化的对象的实际实现,从而可以将这个对象随意替换成我们需要的不同实现工厂方法(Factory Method)概念:定义一个用于创建对象的接口,让子类决定实例化哪个类.它使一个类的实例化延迟到其子类结构图:抽象工厂(Abstract Factory)概念: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类.结构图:单例模式(Singleto
阅读全文
职责链模式 Chain of Responsibility
摘要:职责链模式的作用在于职责转移,其实现实际上是一个链表package chainofres;public abstract class Handler { protected Handler successor; public abstract void action(int request); public void setSuccessor(Handler successor) { this.successor = successor; } }package chainofres;public class ConcurrentHandler...
阅读全文
命令模式
摘要:命令模式共有4个角色: Command, ConcurrentCommand, Reciever, InvokerCommand : 抽象命令类, 定义了Reciver成员和抽象方法executeCommand()用于执行命令ConcurrentCommand : 具体实现命令类, 继承自Command类并实现了抽象方法executeCommand()Reciver : 实际命令执行者, executeCommand()所产生的行为由Reciever实现Invoker : 定义了Command成员,是Command的调用者命令模式的优点是命令记录/撤销功能,可以批次执行命令,并且命令的产生与执
阅读全文
Java 享元模式(Flyweight)
摘要:当一个应用中使用了大量的对象,这些对象造成了很大的存储开销,而对象的大部分状态或参数都是相同(内部状态)的时候,可以考虑使用享元模式,使用享元模式可以是这些对象引用都共享相同的实例,降低存储开销,而对象之间的不同的状态参数(外部状态)则使用外部参数传入来实现。package flyweight;public abstract class WebSite { protected String type; public WebSite(String type) { this.type = type; } public String getTyp...
阅读全文
适配器模式
摘要:适配器模式主要是为了在不能改变现有类的情况下,将一个类转换成另一种类,让他可以适应一个通用的接口public interface Printable { void printSth();}public class Printer implements Printable { @Override public void printSth() { System.out.println("I can print text"); }}public class Photogragher { public void printPhoto(){ Sy...
阅读全文
策略模式
摘要:策略模式记住一句话: 使用统一的接口,根据不同的参数产生不同的表现引用我上一篇的工厂,策略模式简单的如下实现就可以了DBContext.javapackage strategyfactory;import db.DataBase;public class DBContext { private DBContext() {} public static void connect(DataBase db) { System.out.println("Using " + db.getClass().getName()); db.connect(); }}...
阅读全文
从简单工厂到工厂方法
摘要:本例子背景为根据客户端不同的选择,生成不同的数据库连接0. 无工厂代码package nofactory;public class NoFactory { private static final short MYSQL = 0; private static final short SQLSERVER = 1; public static void connect(short dbType) { switch (dbType) { case MYSQL: System.out.println("MySQL c...
阅读全文