新闻资讯

新闻资讯 媒体报道

什么是 “抽象工厂模式” ?

编辑:005     时间:2020-09-23


所谓“工厂模式”,是三种常见设计模式的统称,它们分别是简单工厂模式工厂方法模式抽象工厂模式

这一期,我们来介绍抽象工厂模式

我一直有个疑问:如果业务涉及的子类越来越多,难道每一个子类都要对应一个工厂类吗?

比如,业务中需要创建口罩、防毒面具、防护服这三种产品,而每一种产品有包含高端和低端两类,按照工厂方法模式的解决方案,需要创建的类如下:


如图所示,每一个产品类都对应着一个工厂类,当产品数量很多的时候,工厂类的数量也会越老越多,搞得系统非常复杂。

这时候我们该怎么办呢?

其实这个问题很好解决,如果待创建的产品非常多,我们不需要为每一个产品类配上一个工厂类,而是可以把这些产品进行分组。

对于上面的例子,我们可以把产品分为“高端组”和“低端组”,每个组中的不同产品,由同一个工厂类的不同方法创建:


按照这个思路,我们来实现一下代码。为了表述简单,代码中只有口罩和防护服两大类产品,首先看一下产品类的代码,口罩和防护服是两个抽象接口,分别拥有高端和低端两个实现类:

public interface IMask {

   void showMask();

}

public class LowEndMask implements IMask {

   @Override

   public void showMask(){

       System.out.println("我的低端口罩");

   }

}

public class HighEndMask implements IMask {

   @Override

   public void showMask() {

       System.out.println("我是高端口罩");

   }

}

public interface IProtectiveSuit {

   void showSuit();

}

public class LowEndProtectiveSuit implements IProtectiveSuit {

   @Override

   public void showSuit() {

       System.out.println("我是低端防护服");

   }

}

public class HighEndProtectiveSuit implements IProtectiveSuit {

   @Override

   public void showSuit() {

       System.out.println("我是高端防护服");

   }

}

接下来是工厂类,由于产品分成了高端和低端两大组,工厂也相应分成了高端工厂和低端工厂,各自负责组内产品的创建:

public interface IFactory {

   //创建口罩

   IMask createMask();

   //创建防护服

   IProtectiveSuit createSuit();

}

public class LowEndFactory implements IFactory {

   @Override

   public IMask createMask() {

       IMask mask =  new LowEndMask();

       // .....

       //  LowEndMask的100行初始化代码

       return mask;

   }

   @Override

   public IProtectiveSuit createSuit() {

       IProtectiveSuit suit =  new LowEndProtectiveSuit();

       // .....

       //  LowEndProtectiveSuit的100行初始化代码

       return suit;

   }

}

public class HighEndFactory implements IFactory {

   @Override

   public IMask createMask() {

       IMask mask =  new HighEndMask();

       // .....

       // HighEndMask的100行初始化代码

       return mask;

   }

   @Override

   public IProtectiveSuit createSuit() {

       IProtectiveSuit suit =  new HighEndProtectiveSuit();

       // .....

       //  HighEndProtectiveSuit的100行初始化代码

       return suit;

   }

}

最后是客户端代码,通过实例化不同的工厂子类,调用不同的创建方法,可以创建出不同的产品:

public class Test {

   public static void main(String[] args) {

       IFactory factoryA = new LowEndFactory();

       IFactory factoryB = new HighEndFactory();

       //创建低端口罩

       IMask maskA = factoryA.createMask();

       //创建高端口罩

       IMask maskB = factoryB.createMask();

       //创建低端防护服

       IProtectiveSuit suitA = factoryA.createSuit();

       //创建高端防护服

       IProtectiveSuit suitB = factoryB.createSuit();

       maskA.showMask();

       maskB.showMask();

       suitA.showSuit();

       suitB.showSuit();

   }

}

像这样把产品类分组,组内不同的产品对应于同一工厂类不同方法的设计模式,就是抽象工厂模式。

本内容属于网络转载,文中涉及图片等内容如有侵权,请联系编辑删除

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

回复列表

相关推荐