Java 的工厂方法及代理模式

来源:互联网 发布:淘宝灵符小镇岑一道长 编辑:程序博客网 时间:2024/04/30 05:28

Java 的工厂方法及代理模式

工厂方法(FactoryMethod)

概述:定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。

适用性:

  1. 当一个类不知道它所必须创建的对象的类的时候
  2. 当一个类希望由它的子类来指定它所创建的对象的时候
  3. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候
    这里写图片描述

示例可参考:http://blog.csdn.net/jason0539/article/details/23020989

总结:

FactoryMethod模式是设计模式中应用最为广泛的模式,在面向对象的编程中,对象的创建工作非常简单,对象的创建时机却很重要。FactoryMethod解决的就是这个问题,它通过面向对象的手法,将所要创建的具体对象的创建工作延迟到了子类,从而提供了一种扩展的策略,较好的解决了这种紧耦合的关系。

代理模式(Proxy)

概述:为其他对象提供一种代理以控制对这个对象的访问

示例:引用自http://blog.csdn.net/goskalrie/article/details/52458773

/**方式一:聚合式静态代理 * @author Goser    (mailto:goskalrie@163.com) * @Since 2016年9月7日 *///1.抽象主题接口public interface Manager {    void doSomething();}//2.真实主题类public class Admin implements Manager {    public void doSomething() {        System.out.println("Admin do something.");    }}//3.以聚合方式实现的代理主题public class AdminPoly implements Manager{    private Admin admin;    public AdminPoly(Admin admin) {        super();        this.admin = admin;    }    public void doSomething() {        System.out.println("Log:admin操作开始");        admin.doSomething();        System.out.println("Log:admin操作结束");    }}//4.测试代码        Admin admin = new Admin();        Manager m = new AdminPoly(admin);        m.doSomething();//方式二:继承式静态代理//与上面的方式仅代理类和测试代码不同//1.代理类public class AdminProxy extends Admin {    @Override    public void doSomething() {        System.out.println("Log:admin操作开始");        super.doSomething();        System.out.println("Log:admin操作开始");    }}//2.测试代码        AdminProxy proxy = new AdminProxy();        proxy.doSomething();

接口用法总结

  • 通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。
  • 通过接口可以指明多个类需要实现的方法,一般用于定义对象的扩张功能。
  • 接口主要用来定义规范。解除耦合关系

接口与抽象类的关系

No. 区别点 抽象类 接口 1 定义 包含一个抽象方法的类 抽象方法和全局常量的集合 2 组成 构造方法、抽象方法、普通方法、常量、变量 常量、抽象方法 3 使用 子类继承抽象类(extends) 子类实现接口(implements) 4 关系 抽象类可以实现多个接口 接口不能继承抽象类,但允许继承多个接口 5 常见设计模式 模板设计 工厂设计、代理设计 6 对象 都通过对象的多态性产生实例化对象 7 局限 抽象类有单继承的局限 接口没有此局限 8 实际 作为一个模板 是作为一个标准或是表示一种能力 9 选择 如果抽象类和接口都可以使用的话,优先使用接口,因为避免单继承的局限 10 特殊 一个抽象类中可以包含多个接口,一个接口中可以包含多个抽象类