设计模式 - 抽象工厂模式

本文深入解析抽象工厂模式,探讨其与工厂方法模式的区别,并通过示例代码展示如何创建一系列相关或相互依赖的对象,同时讨论了该模式的优点、缺点及适用场景。

一. 简述

为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

比如每个抽象产品角色都有两个具体产品。抽象工厂模式提供两个具体工厂角色,分别对应于这两个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化。每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。

属于创建型模式


工厂方法模式 vs 抽象工厂模式

抽象工厂模式是工厂方法模式的升级版本,他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。


二. 组成

  • 抽象工厂(Abstract Factory)角色担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。
  • 具体工厂(Concrete Factory)角色这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。
  • 抽象产品(Abstract Product)角色担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
  • 具体产品(Concrete Product)角色抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。

三. UML类图


四. 基本代码

//两种抽象产品:水果、蔬菜
public interface Fruit{}
public interface Veggie{}

//四种具体产品:北方水果,热带水果,北方蔬菜,热带蔬菜
// Northern Fruit
public class NorthernFruit implements Fruit{
    private String name;
    public NorthernFruit(String name)
    {}

    public String getName(){
        return name;
    }

    public void setName(String name){
        this. name = name;
    }
}

// TropicalFruit
public class TropicalFruit implements Fruit{
    private String name;
    public TropicalFruit(String name)
    {}

    public String getName(){
        return name;
    }

    public void setName(String name){
        this. name = name;
    }
}

// NorthernVeggie
public class NorthernVeggie implements Veggie{
    private String name;
    public NorthernVeggie(String name)
    {}

    public String getName(){
        return name;
    }

    public void setName(String name){
        this. name = name;
    }
}

//TropicalVeggie
public class TropicalVeggie implements Veggie{
    private String name;
    public TropicalVeggie(String name)
    {}

    public String getName(){
        return name;
    }

    public void setName(String name){
        this. name = name;
    }
}

//抽象工厂角色
public interface Gardener{
    public Fruit createFruit(String name);
    public Veggie createVeggie(String name);
}

//具体工厂角色:北方工厂,热带角色
public class NorthernGardener implements Gardener{
    public Fruit createFruit(String name){
        return new NorthernFruit(name);
    }

    public Veggie createVeggie(String name){
        return new NorthernVeggie(name);
    }
}

public class TropicalGardener implements Gardener{
    public Fruit createFruit(String name){
        return new TropicalFruit(name);
    }

    public Veggie createVeggie(String name){
        return new TropicalVeggie(name);
    }
}


五. 优缺点

优点:

  1. 易于交换产品系列,由于具体工厂类在一个应用中只需在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。
  2. 让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。

缺点:

  1. 产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。

六. 应用场景

当需要创建的对象是一系列相互关联或相互依赖的产品族时,便可以使用抽象工厂模式。说的更明白一点,就是一个继承体系中,如果存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存在着一定的关联或者约束,就可以使用抽象工厂模式。假如各个等级结构中的实现类之间不存在关联或约束,则使用多个独立的工厂来对产品进行创建,则更合适一点。


七. 注意事项

        无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。

       所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。



内容概要:本文系统阐述了企业新闻发稿在生成式引擎优化(GEO)时代下的全渠道策略与效果评估体系,涵盖当前企业传播面临的预算、资源、内容与效果评估四大挑战,并深入分析2025年新闻发稿行业五大趋势,包括AI驱动的智能化转型、精准化传播、首发内容价值提升、内容资产化及数据可视化。文章重点解析央媒、地方官媒、综合门户和自媒体四类媒体资源的特性、传播优势与发稿策略,提出基于内容适配性、时间节奏、话题设计的策略制定方法,并构建涵盖品牌价值、销售转化与GEO优化的多维评估框架。此外,结合“传声港”工具实操指南,提供AI智能投放、效果监测、自媒体管理与舆情应对的全流程解决方案,并针对科技、消费、B2B、区域品牌四大行业推出定制化发稿方案。; 适合人群:企业市场/公关负责人、品牌传播管理者、数字营销从业者及中小企业决策者,具备一定媒体传播经验并希望提升发稿效率与ROI的专业人士。; 使用场景及目标:①制定科学的新闻发稿策略,实现从“流量思维”向“价值思维”转型;②构建央媒定调、门户扩散、自媒体互动的立体化传播矩阵;③利用AI工具实现精准投放与GEO优化,提升品牌在AI搜索中的权威性与可见性;④通过数据驱动评估体系量化品牌影响力与销售转化效果。; 阅读建议:建议结合文中提供的实操清单、案例分析与工具指南进行系统学习,重点关注媒体适配性策略与GEO评估指标,在实际发稿中分阶段试点“AI+全渠道”组合策略,并定期复盘优化,以实现品牌传播的长期复利效应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值