资讯专栏INFORMATION COLUMN

设计模式之抽象工厂

VincentFF / 2527人阅读

摘要:类图上面的这张图引用设计模式之禅关于抽象工厂的通用类图,说实话,我觉得这张图很难懂,不容易表述抽象工厂模式也或许是个人理解能力。

前言

关于抽象工厂模式,博主初学的时候是懵逼的,花了好大力气才明白它与工厂模式的异同,不得不说理解能力还有待加强(~。~)

什么是抽象工厂模式
为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。

让我们再回顾下工厂模式的定义:

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。

从定义上看,区别在于抽象工厂是针对一组相关或依赖的对象(产品和产品之间有共同的约束),而工厂模式是针对一种产品。

UML类图

上面的这张图引用设计模式之禅关于抽象工厂的通用类图,说实话,我觉得这张图很难懂,不容易表述抽象工厂模式(也或许是个人理解能力)。下面上我的例子:

抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。要想理解抽象工厂模式,有两个概念我们是必须要理解的。

产品族:功能相关联的一组产品,一般位于不同产品等级结构的相同位置上,每一个产品族中的产品数应该与产品等级结构数一致。在上面的例子中:ComputerCpu和ComputerRam属于一个产品族,MobileRam和MobileCpu属于一个产品族.

产品等级结构: 一种产品内部的不同等级。比如cpu下的computerCpu和MobileCpu,Ram下的computerRam和mobileRam.

看懂了吗?没看懂就再看一遍啊.....如果不理解这两个概念,就不会理解抽象工厂,所以务必看懂再看接下来的文章.(想要更仔细的了解这两个概念,可以观看链接描述)

使用场景

一组对象有相同的约束,就可以使用抽象工厂模式。就比如我们常用的qq音乐,有mac版的,有windows版的,他们共同的约束就是操作系统。相应的在这个也无力,产品族有两个,mac版qq音乐和windows版qq音乐。产品等级结构只有一个就是qq音乐了。

代码分析

按照上面的cpu和ram

public abstract class Cpu {

    public void introduce() {
        System.out.println("我是" + getOperationSystem() + "处理器,运算速度贼快");
    }

    abstract String getOperationSystem();
}
public class ComputerCpu extends Cpu {
    @Override
    String getOperationSystem() {
        return "pc";
    }
}
public class MobileCpu extends Cpu {
    @Override
    String getOperationSystem() {
        return "移动端";
    }
}
public abstract class Ram {
    public void introduce(){
        System.out.println("我是"+getOperationSystem()+"内存,存取速度贼快");
    }

    abstract String getOperationSystem();
}
public class ComputerRam extends Ram {
    @Override
    String getOperationSystem() {
        return "pc";
    }
}
public class MobileRam extends Ram {
    @Override
    String getOperationSystem() {
        return "移动端";
    }
}
public abstract class AbstractFactory {

    abstract Cpu createCpu();
    abstract Ram createRam();
}
public class ComputerFactory extends AbstractFactory {
    @Override
    Cpu createCpu() {
        return new ComputerCpu();
    }

    @Override
    Ram createRam() {
        return new ComputerRam();
    }
}
public class MobileFactory extends AbstractFactory {
    @Override
    Cpu createCpu() {
        return new MobileCpu();
    }

    @Override
    Ram createRam() {
        return new MobileRam();
    }
}
public class Client {

    public static void main(String[] args) {
        AbstractFactory computerFactory = new ComputerFactory();
        AbstractFactory mobileFactory = new MobileFactory();

        computerFactory.createCpu().introduce();
        computerFactory.createRam().introduce();

        mobileFactory.createCpu().introduce();
        mobileFactory.createRam().introduce();
    }
}
测试结果:
我是pc处理器,运算速度贼快
我是pc内存,存取速度贼快
我是移动端处理器,运算速度贼快
我是移动端内存,存取速度贼快

相信只要前面的理论懂了,上面的这个小例子简直不要太轻松。

抽象厂模式具有封装性,高层模块在调用时根本不需要关心具体实现类,只要知道接口(抽象类)就可以了,我们不需要关心对象的创建问题,将创建对象的问题统统抛给工厂,只需知道一个工厂,就可以创造这个产品组的所有产品,优秀的设计就该如此。

产品族内的约束非公开状态,比如我使用手机,用的cpu和ram肯定都是移动端的,你总不可能手机用pc的cpu或者ram吧,本来就是不配套的配置。但是我们不需要去关心这个,因为他们的约束都在工厂内实现

总结

抽象工厂模式主要是解决一组具有相同约束的对象的创建问题。其中最核心的概念就是产品族和产品等级结构,抽象工厂模式在扩展产品等级结构是非常容易的,只需要增加新的产品类和新的工厂类就可以,从这点看它是符合开闭原则的,若是想扩展产品族,也就是增加一种产品,就需要创建对应类,同时需要修改所有的工厂,是不符合开闭原则的。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70626.html

相关文章

  • 一天一个设计模式JS实现——工厂模式

    摘要:参考文章深入理解三种工厂模式工厂模式,工厂方法模式,抽象工厂模式详解工厂模式是中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 参考文章:深入理解java三种工厂模式工厂模式,工厂方法模式,抽象工厂模式 详解 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的...

    Muninn 评论0 收藏0
  • 优才公开课笔记:php设计模式 (二)工厂模式

    摘要:但本质是,简单工厂并未严格遵循设计模式的开闭原则,当需要增加新产品时也需要修改工厂代码。但是工厂方法则严格遵守开闭原则,模式只负责抽象工厂接口,具体工厂交给客户去扩展。 最近开展了三次设计模式的公开课,现在来总结一下设计模式在PHP中的应用,这是第二篇创建型模式之工厂模式。 设计模式的一般介绍在第一篇文章讲了,这里就不重复。 工厂模式 实现:定义一个用于创建对象的接口,让子类决定实...

    aisuhua 评论0 收藏0
  • 设计模式抽象工厂模式

    摘要:所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。 0x01.定义与类型 定义:抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口 无需指定它们具体的类 类型:创建型 UML showImg(https://segmentfault.com/img/bVbtBp1?w=800&h=862...

    Acceml 评论0 收藏0
  • 工厂模式(一)抽象工厂模式

    摘要:主要详解简单工厂模式到抽象工厂模式的演变。抽象工厂模式当一个类别的产品还有多个系列区分时,为了按系列生产商品,使用抽象工厂区分。 主要详解简单工厂模式到抽象工厂模式的演变。 简单工厂模式 即静态工厂模式1.将对象的创建和使用分开;2.将生产过程集中,便于集中管理;3.当需要创建的对象类有变动时,就不用在所有new 的地方修改了,直接修改工厂类即可; /** * 简单工厂模式 ---...

    woshicixide 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<