【设计模式】——创建类型模式——抽象工厂模式

本文介绍了抽象工厂模式,一种用于创建一系列相关或相互依赖对象的模式,它隔离了具体类的生成,使得客户端无需关心具体产品类型。通过海尔工厂和电视机、空调的例子展示了产品族和产品等级结构的概念,强调了该模式在产品等级结构稳定时的适用性,并分析了其优缺点。在实际应用中,抽象工厂模式遵循依赖倒转原则,允许在不修改客户端代码的情况下扩展产品族。
摘要由CSDN通过智能技术生成

抽象工厂模式

  1. 有两个变化维度

  2. 有一个变化维度包含的产品是继承统一品牌工厂——产品等级结构

    另一个变化维度包含的产品通常为一起使用——产品族

动机

一个工厂提供多个产品对象——海尔工厂可以生产海尔冰箱,海尔电视机等且有多个品牌

定义

  1. 对象创建型模式
  2. 提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类

结构

抽象工厂:针对抽象产品进行声明

具体工厂:针对具体产品进行声明

抽象产品:一类产品——电视机、冰箱

具体产品:具体后一个产品——海尔电视机

产品族和产品等级结构

在这里插入图片描述

产品族:统一品牌工厂生产的一同协作的一族产品

产品等级结构:不同种类的产品

在这里插入图片描述

*注:课件问题,虚实线不准确,准确的请看后续另一个图。

分析

产品族:对应工厂

产品等级结构:对应产品

简例

在这里插入图片描述
在这里插入图片描述

如何定义产品族和产品等级结构

关键哪些是一同协作,倘若上述的转换横纵坐标,那么产品族为WindowsButton、UnixButton和LinuxButton,而产品族的定义为一同协作,显然这三种按钮不可能在同一电脑上一同协作

实例

在这里插入图片描述
在这里插入图片描述

*注:这里的虚实线为准确的虚实线

EFactory类
public interface EFactory
{
   public Television produceTelevision();
   public AirConditioner produceAirConditioner();
}
Television类
public interface Television
{
   public void play();
}
AirConditioner类
public interface AirConditioner
{
   public void changeTemperature();
}
HaierFactory类
public class HaierFactory implements EFactory
{
   public Television produceTelevision()
   {
      return new HaierTelevision();
   }
   
   public AirConditioner produceAirConditioner()
   {
      return new HairAirConditioner();
   }
}
HaierTelevision类
public class HaierTelevision implements Television
{
   public void play()
   {
      System.out.println("海尔电视机播放中......");
   }
}
HaierAirConditioner类
public class HairAirConditioner implements AirConditioner
{
   public void changeTemperature()
   {
      System.out.println("海尔空调温度改变中......");
   }
}

*注:另一产品相同,不作重复展示

Client类
public class Client
{
   public static void main(String args[])
   {
         try
         {
           EFactory factory;
           Television tv;
           AirConditioner ac;
           factory=(EFactory)XMLUtil.getBean();
           tv=factory.produceTelevision();
           tv.play();
           ac=factory.produceAirConditioner();
           ac.changeTemperature();
         }
         catch(Exception e)
         {
           System.out.println(e.getMessage());
         }
   }
}

客户端类里定义的都是抽象层的,符合依赖倒转原则

运行结果

在这里插入图片描述

优点

  1. 隔离了具体类生成,客户端不需要知道什么被创建了
  2. 一个产品族多个对象设计成一起工作是,能保证只使用统一产品族中的对象——通过配置文件,都是使用的海尔工厂生产的产品族
  3. 新增产品族很方便,无需修改已有系统,符合开闭原则

缺点

增加产品等级结构的时候要修改代码,违背开闭原则——开闭原则的倾斜性,往一侧倾斜。因此,如果产品族和产品等级结构不容易区分时,则将常扩展维度的定为产品族,不常扩展的维度定位产品等级结构

适用场景

  1. 不依赖于产品类实例怎么被创建、组合和表达的细节
  2. 有多个产品族,但每次只使用某一产品族
  3. 产品等级结构稳定

退化

当抽象工厂每个具体工厂类只有一个产品对象时,即只有一个产品等级结构时,退化成工厂方法模式——海尔工厂只生产电视机。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值