Java 的工厂方法及代理模式
工厂方法(FactoryMethod)
概述:定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。
适用性:
- 当一个类不知道它所必须创建的对象的类的时候
- 当一个类希望由它的子类来指定它所创建的对象的时候
- 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候
示例可参考: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 {@Overridepublic 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 | 特殊 | 一个抽象类中可以包含多个接口,一个接口中可以包含多个抽象类 |