三、抽象工厂模式
1.为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。抽象工厂模式是工厂方法模式的升级版本。在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。
2.抽象工厂模式与工厂方法模式类似,也是有四个不同的角色:
(1)抽象工厂角色:任何创建对象的工厂类必须实现这个接口
(2)具体工厂角色:该角色实现了抽象工厂接口,含有选择合适的产品对象的逻辑,并且受到应用程序的调用以创建产品对象
(3)抽象产品角色:该角色负责定义产品的共性,实现对产品最抽象的定义
(4)具体产品角色:实现抽象产品角色所声明的接口,抽象工厂模式所创建的任何产品对象都是某个具体产品角色的实例
3.抽象工厂模式的优点
抽象工厂模式是工厂方法模式的进一步抽象,针对的是一族产品。如果产品族中只有一种产品,则抽象工厂模式就退化为工厂方法模式。除了工厂方法模式外,抽象工厂 模式还具有下列优点:
(1)产品族内的约束为非公开状态,在不同的工厂中,各种产品可能具有不同的相互依赖关系,这些依赖关系由工厂封装在其内部,对于工厂的使用者是不可见的
(2)生产线的扩展非常容易,如果要针对同一产品族建立新的生产线,只需要实现产品族中所有产品接口并建立新的工厂类即可。
缺点:
(1)产品族本身的扩展非常困难,如果需要在产品族中增加一个新的产品类型。则需要修改多个接口,并且会影响已有的产品类。
4.抽象工厂模式的适用场景
当一个对象族都具有相同的约束,则可以使用抽象工厂模式
5.抽象工厂模式的实例
抽象工厂
public interface AbstractFactory {
//创建产品A
public ProductA factoryA();
//创建产品B
public ProductB factoryB();
}
具体工厂1
public class ConcreteFactory1 implements AbstractFactory{
public ProductA factoryA(){
return new ProductA1();
}
public ProductB factoryB(){
return new ProductB1();
}
}
具体工厂2
public class ConcreteFactory2 implements AbstractFactory {
public ProductA factoryA(){
return new ProductA2();
}
public ProductB factoryB(){
return new ProductB2();
}
}
抽象产品A
public interface ProductA {
public void method1();
public void method2();
}
具体产品A1
public class ProductA1 implements ProductA{
public void method1(){
System.out.println("等级为1的产品A的实现方法");
}
public void method2(){
}
}
具体产品A2
public class ProductA2 implements ProductA{
public void method1(){
System.out.println("等级为2的产品A的实现方法");
}
public void method2(){
}
}
抽象产品B
public interface ProductB {
public void method1();
public void method2();
}
具体产品B1
public class ProductB1 implements ProductB {
public void method1(){
System.out.println("等级为1的产品B的实现方法");
}
public void method2(){
}
}
具体产品B2
public class ProductB2 implements ProductB{
public void method1(){
System.out.println("等级为2的产品B的实现方法");
}
public void method2(){
}
}
测试
public class ClientDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
//定义两个工厂
AbstractFactory factory1 = new ConcreteFactory1();
AbstractFactory factory2 = new ConcreteFactory2();
//生产等级为1的产品A
ProductA a1 = new ProductA1();
ProductA a2 = new ProductA2();
ProductB b1 = new ProductB1();
ProductB b2 = new ProductB2();
a1.method1();
a2.method1();
b1.method1();
b2.method1();
}
}
运行结果:
6.写到这里,必须要总结一下。写下整个实例的过程真的是麻烦,代码量不小!!
四、代理模式
1.为其他对象提供一种代理以控制对这个对象的访问
2.代理模式提供以下3个角色:
(1)抽象主题角色:该角色是代理主题和真实主题的接口,以便在任何可以使用真实主题的地方都可以使用代理主题
(2)代理主题角色:该角色负责控制对真实主题的引用
(3)真实主题角色:是业务逻辑的具体执行者
3.代理模式的种类
(1)远程代理:为一个位于不同的地址空间的对象提供一个局部代表对象。找哥哥不同的地址空间可以是在本机器中,也可以在另一台机器中
(2)虚拟代理:有时需要创建一些消耗较多资源的对象,可以首先创建代理对象,而将真实对象的创建延迟。
(3)保护代理:控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限
(4)缓存代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果
(5)同步代理:使几个用户能够同时使用一个对象而没有冲突
(6)智能引用代理:当一个对象被引用时,提供一些额外的操作
4.代理模式的优点
(1)职责清晰
(2)高扩展性
(3)智能化
5.代理模式的适用场景
Java RMI 的远程调用就是一种代理模式的应用;AOP也可以通过代理模式实现。
6.代理模式代码
Subject.java
public interface Subject {
public void request();
}
RealSubject.java
public class RealSubject implements Subject {
public void request(){
}
}
ProxySubject.java
public class ProxySubject implements Subject {
private Subject subject;
public ProxySubject(Subject subject){
this.subject = subject;
}
public void request(){
this.beforeRequest();
subject.request();
this.afterRequest();
}
private void beforeRequest(){
}
private void afterRequest(){
}
}