1、1,设计模式,2,本节主要内容,Singleton模式 Factory 模式 抽象工厂模式 Prototype(原型) Builder 模式 Adapter示例 Composite(组合) Proxy(代理) Decorator Bridge Observer,3,Singleton模式,应用场景 模式形式一 public class Singleton private Singleton()private static Singleton instance = new Singleton(); public static Singleton getInstance() return inst
2、ance; ,4,Singleton模式,模式形式二 public class Singleton private static Singleton instance = null; public static synchronized Singleton getInstance() if (instance=null) instancenew Singleton(); return instance; ,5,Factory 模式,使用场景 构建实例时需要进行大量初始化工作 接口或基类有多个类似的派生类,6,Factory 模式,模式形式 public class Factorypublic
3、static Sample creator(int which) if (which=1) return new SampleA(); else if (which=2) return new SampleB(); ,7,抽象工厂模式,抽象工厂模式与简单工厂模式的区别在于需要创建对象的复杂程度上 抽象工厂模式将Factory变成抽象类,将共同部分封装在抽象类中,不同部分使用子类实现 假设:Sample有两个实现类SampleA和SamleB,而Sample2也有两个实现类Sample2A和SampleB2,8,抽象工厂模式,模式形式 public abstract class Factoryp
4、ublic abstract Sample creator();public abstract Sample2 creator(String name); public class SimpleFactory extends Factorypublic Sample creator() . return new SampleA public Sample2 creator(String name) . return new Sample2A ,9,抽象工厂模式,public class BombFactory extends Factorypublic Sample creator() ret
5、urn new SampleB public Sample2 creator(String name) return new Sample2B ,10,Prototype(原型),应用场景 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 在Java中Prototype模式变成clone()方法的使用,11,Prototype(原型),public abstract class AbstractSpoon implements Cloneable String spoonName; public void setSpoonName(String spoonName) this.s
6、poonName = spoonName; public String getSpoonName() return this.spoonName; public Object clone() Object object = null; try object = super.clone(); catch (CloneNotSupportedException exception) System.err.println(“AbstractSpoon is not Cloneable“); return object; ,12,Prototype示例,public class SoupSpoon e
7、xtends AbstractSpoon public SoupSpoon() setSpoonName(“Soup Spoon“); AbstractSpoon spoon = new SoupSpoon(); AbstractSpoon spoon2 = spoon.clone();,13,Builder 模式,应用场景 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 首先假设一个复杂对象是由多个部件组成的,Builder模式是把复杂对象的创建和部件的创建分别开来,分别用Builder类和Director类来表示,14,Builder 示例,public inte
8、rface Builder /创建部件A 比如创建汽车车轮 void buildPartA(); /创建部件B 比如创建汽车方向盘 void buildPartB(); /创建部件C 比如创建汽车发动机 void buildPartC(); /返回最后组装成品结果 (返回最后装配好的汽车) /成品的组装过程不在这里进行,而是转移到下面/的Director类中进行。从而实现了解耦过程和部件 Product getResult(); ,15,Builder示例,public class Director private Builder builder; public Director( Build
9、er builder ) this.builder = builder; / 将部件partA B C最后组成复杂对象的过程 public void construct() builder.buildPartA(); builder.buildPartB(); builder.buildPartC(); ,16,Builder示例,public class ConcreteBuilder implements Builder Part partA, partB, partC; public void buildPartA() /这里是具体如何构建partA的代码 ; public void b
10、uildPartB() /这里是具体如何构建partB的代码 ; public void buildPartC() /这里是具体如何构建partB的代码 ; public Product getResult() /返回最后组装成品结果; ,17,Builder示例,ConcreteBuilder builder = new ConcreteBuilder(); Director director = new Director( builder ); director.construct(); Product product = builder.getResult();,18,Adapter模式
11、,应用场景 将两个不兼容的类纠合在一起使用 属于结构型模式 需要有Adaptee(被适配者)和Adaptor(适配器)两个身份,19,Adapter示例,假设有两种类:方形桩 圆形桩 public class SquarePeg public void insert(String str) System.out.println(“SquarePeg insert():“+str); public class RoundPeg public void insertIntohole(String msg) System.out.println(“RoundPeg insertIntoHole():
12、“+msg); ,20,Adapter示例,现在有一个应用,需要既打方形桩,又打圆形桩. 我们需要将这两个没有关系的类综合应用. 假设RoundPeg我们没有源代码,或源代码我们不想修改,21,Adapter示例,public class PegAdapter extends SquarePeg private RoundPeg roundPeg;public PegAdapter(RoundPeg peg)(this.roundPeg=peg;)public void insert(String str) roundPeg.insertIntoHole(str); ,22,Adapter,思
13、考问题 上面的PegAdapter是继承了SquarePeg 如果想两边继承,即继承SquarePeg 又继承RoundPeg ,该如何处理?,23,Composite(组合),应用场景 对象以树形结构组织起来 组合体内这些对象都有共同接口 当组合体一个对象的方法被调用执行时,Composite将遍历整个树形结构,寻找同样包含这个方法的对象并实现调用执行,24,Composite示例,public abstract class Equipment private String name; /网络价格 public abstract double netPrice();/折扣价格 public
14、abstract double discountPrice();/增加部件方法 public boolean add(Equipment equipment) return false; /删除部件方法 public boolean remove(Equipment equipment) return false; /注意这里,这里就提供一种用于访问组合体类的部件方法。 public Iterator iter() return null; public Equipment(final String name) this.name=name; ,25,Composite示例,public cl
15、ass Disk extends Equipment public Disk(String name) super(name); /定义Disk网络价格为1 public double netPrice() return 1.; /定义了disk折扣价格是0.5 对折。 public double discountPrice() return .5; ,26,Composite示例,Cabinet cabinet=new Cabinet(“Tower“); Chassis chassis=new Chassis(“PC Chassis“); /将Chassis装到Tower中 (将盘盒装到箱子
16、里) cabinet.add(chassis); /将一个硬盘装到 Chassis (将硬盘装到盘盒里) chassis.add(new Disk(“10 GB“); /调用 netPrice()方法; System.out.println(“netPrice=“+Price();,27,Proxy(代理),应用场景 为其他对象提供一种代理以控制对这个对象的访问 授权机制 不同级别的用户对同一对象拥有不同的访问权利 某个客户端不能直接操作到某个对象,但又必须和那个对象有所互动 示例参见Proxy.java,28,Decorator,应用场景 拓展功能 由用户动态决定加入的方式和时机 在运行期间
17、决定何时增加何种功能,29,Decorator示例,定义接口 public interface Work public void insert();,30,Decorator示例,接口的实现,完成一件具体工作 public class SquarePeg implements Work public void insert() System.out.println(“方形桩插入“); ,31,Bridge,应用场景 将抽象和行为划分开来,各自独立,但能动态的结合 示例 Bridge.java,32,Observer,应用场景 对于一个事件源,有多个监听者 Java的API还为为我们提供现成的Observer接口Java.util.Observer AlarmObserver.java WsfAlarmPool.java,33,小结,Singleton模式 Factory 模式 dd 抽象工厂模式 Prototype(原型) Builder 模式 Adapter示例 Composite(组合) Proxy(代理) Decorator Bridge Observer,