zoukankan      html  css  js  c++  java
  • 设计模式之抽象工厂模式

          在上一篇博客里面,笔者讲到了工厂模式,相信看到的朋友就会感到奇怪,为什么这篇博客又来讲工厂模式呢?是不是重复了?到底工厂模式和抽象工厂模式有什么区别呢?下面就让我们带着这些问题开始进入今天的主题吧!

          首先我们来看看两者的具体定义是怎么说的,工厂模式的定义为:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。抽象工厂模式的定义为:为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。通过上面的定义,我们就能很明显发现它们之间的区别。上一篇博客实例里面,我们能够发现创建一个对象的时候,我们会将最终的子类对象传到工厂方法里面,从而能够创建出特定的子类对象。但是在抽象工厂模式里面则不是这样的,它只负责提供一个创建的入口,你想要创建什么对象就调用相应的方法就可以了,不需要传进特定的子类对象。下面笔者将通过一个实例来说明抽象工厂模式的具体使用。

          首先我们来定义一个产品接口Product:

    public interface Product {
    
    	void shareMethod();
    	void doSomething();
    }
    

    然后我们再来定义两个具体的产品ProductA和ProductB,具体代码如下:

    public class ProductA implements AbstractProductA {
    
    	@Override
    	public void shareMethod() {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void doSomething() {
    		// TODO Auto-generated method stub
    		
    	}
    
    }
    
    public class ProductA2 implements AbstractProductA {
    
    	@Override
    	public void shareMethod() {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void doSomething() {
    		// TODO Auto-generated method stub
    		
    	}
    
    }
    

    在这里我们省略了B产品的定义代码,方法同产品A是一样的。接下来我们是不是就应该开始定义抽象工厂了,代码如下:

    public class Create1 extends AbstractCreator {
    
    	@Override
    	public AbstractProductA createProductA() {
    		return new ProductA();
    	}
    
    	@Override
    	public AbstractProductB createProductB() {
    		return new ProductB();
    	}
    
    }
    
    public class Create2 extends AbstractCreator {
    
    	@Override
    	public AbstractProductA createProductA() {
    		return new ProductA2();
    	}
    
    	@Override
    	public AbstractProductB createProductB() {
    		return new ProductB2();
    	}
    
    }
    

    最后我们在需要创建产品A、B的地方调用相应的Create方法就可以了。

          通过上面的方法,我们能够很明显的发现:随着后面的产品组合的增加,我们将需要定义更多的ProductN和CreateN,因为创建者是随着产品的不同组合、不同数量发生变化的。这样的话,我们就需要同时修改多个地方,严重的违背了开闭原则,所以在使用抽象工厂模式的时候,针对多产品需要的场景慎用。

          好了,今天的博客就到这里吧,see you!

  • 相关阅读:
    “混乱有序”一首关于概率论的诗
    关于“混乱有序”理论的讨论 2020-09-20
    关于“混乱有序”理论的讨论 2020-08-30
    【Java】(有步骤!)模逆、模幂、十进制转十六进制、十六进制转十进制、xTime算法、LFSR画状态图、椭圆曲线加法、椭圆曲线乘法、获得椭圆曲线上的点
    算法导论第一课
    经典力学:第一课
    计算机科学及编程导论:第一课
    微积分重点:第十六至十八课
    微积分重点:第十四,十五课
    微积分重点:第十课至十三课
  • 原文地址:https://www.cnblogs.com/xiaocai20091687/p/xiaocai_design_four.html
Copyright © 2011-2022 走看看