《设计模式——java版》(三)

本文详细介绍了抽象工厂模式和代理模式的概念、角色、优缺点及应用场景。通过具体实例展示了如何利用这两种设计模式来提高软件设计的灵活性和扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

三、抽象工厂模式

        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(){
		
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值