写点什么

AbstractFactoryPattern- 抽象工厂模式

作者:梁歪歪 ♚
  • 2022 年 5 月 28 日
  • 本文字数:1822 字

    阅读完需:约 6 分钟

AbstractFactoryPattern-抽象工厂模式

抽象方法模式,它是工厂方法模式的升级版本,该模式依旧使用农场种植水果的实例进行具体说明。

抽象工厂模式

抽象工厂模式(Abstract Factory Pattern):是指提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。客户端(应用层)不依赖于产品类实例如何被创建、实现等细节。


抽象工厂模式强调的是一系列相关的产品对象(属于同一产品族)一起使用创建对象时需要大量重复的代码。此时我们就需要提供一个产品类的库,使得所有的产品以同样的接口出现,这样客户端就可以不依赖于具体实现。


什么是产品族在学习抽象工厂模式之前,我们需要先了解一下什么叫产品族。产品族指的就是相似的产品,比如说我们常用的手机,有华为、小米、OPPO,这些不同品牌的手机就属于同一个产品族,它们隶属于不同的公司,也就是需要由不同的工厂进行生产,这些工厂都可以共用同一个抽象方法来生产手机,这就是抽象工厂模式的本质,将相似的产品(同一产品族)抽象出公共的方法,统一对外接口。


示例:


我们还是通过农场种植水果举例进行说明。为了方便举例,我们只将水果和农场分为南北两个品种,比如南方农场生产的苹果和橘子称之为南方苹果和南方橘子,而北方农场生产的苹果和橘子就称之为北方苹果和北方橘子。


  • 新建一个苹果的接口IApple.java,定义一个种植苹果的方法。


package cn.liangyy.abstractFactory;
/** * 苹果接口 */public interface IApple { void growApple(); //种植苹果}
复制代码


  • 新建一个南方苹果类SouthApple.java


package cn.liangyy.abstractFactory;
public class SouthApple implements IApple { @Override public void growApple() { System.out.println("种植南方苹果"); }}
复制代码


  • 新建一个橘子的接口IOrange.java,定义一个种植橘子的方法。


package cn.liangyy.abstractFactory;
/** * 橘子接口 */public interface IOrange { void growOrange(); //种植橘子}
复制代码


  • 新建一个南方橘子类SouthOrange.java


package cn.liangyy.abstractFactory;
public class SouthOrange implements IOrange { @Override public void growOrange() { System.out.println("种植南方橘子"); }}
复制代码


以上就是将产品抽象化的过程,接下来我们就需要将产品交给工厂进行创建。


  • 新建一个抽象工厂接口IFactory.java,定义两个方法,一个用来创建苹果对象,一个用来创建橘子对象。


package cn.liangyy.abstractFactory;
/** * 抽象工厂接口 */public interface IFactory { IApple createApple(); IOrange createOrange();}
复制代码


  • 新建一个南方工厂类SouthFarmFactory.java


package cn.liangyy.abstractFactory;
/** * 南方工厂 */public class SouthFarmFactory implements IFactory { @Override public IApple createApple() { return new SouthApple(); //南方农场生成南方苹果 }
@Override public IOrange createOrange() { return new SouthOrange(); //南方农场生成南方橘子 }}
复制代码


  • 新建一个测试类


package cn.liangyy.abstractFactory;
/** * 抽象工厂-测试类 */public class TestAbstractFactory { public static void main(String[] args) { //构建南方农场 IFactory southFarmFactory = new SouthFarmFactory(); //获得南方苹果 IApple apple = southFarmFactory.createApple(); //输出:种植南方苹果 apple.growApple();
//获得南方橘子 IOrange orange = southFarmFactory.createOrange(); //输出:种植南方橘子 orange.growOrange(); }}
复制代码


上面只有南方农场生产水果的例子,大家还可自行添加测试。假如这时候又有一个新的农场要建立生产一样的产品,那么就可以再新建一个对应的产品类和对应的工厂类就可以实现了。


抽象工厂模式的适用场景抽象工厂模式适用于我们有一系列类似的产品,就比如说手机、电脑等,这些产品的品牌、机型等都不同,但相同的都是手机或者是电脑,那么这个时候我们就可以利用抽象工厂模式来将产品进行抽象化。


抽象工厂模式的缺点就比如上述示例中,我们现在想在农场种植其他的水果,那么我们需要修改工厂的源码,新增种植水果的方法,这样的话抽象工厂和具体工厂都需要修改,很显然是违背了开闭原则。所以抽象工厂模式使用的前提必须是产品比较稳定,不会轻易作出修改,否则后期的维护将会非常困难。

发布于: 刚刚阅读数: 4
用户头像

梁歪歪 ♚

关注

还未添加个人签名 2021.07.22 加入

还未添加个人简介

评论

发布
暂无评论
AbstractFactoryPattern-抽象工厂模式_设计模式_梁歪歪 ♚_InfoQ写作社区