当前位置: 首页 >  网技达人 >  抽象工厂模式的运用

抽象工厂模式的运用

导读:一、案例背景.计算机包含内存(RAM),CPU 等硬件设备,根据如图所示的“产品等级结构-产品族示意图”,使用抽象工厂模式实现计算机设备创建过程并绘制类图.二、实现步骤.根据题意,使用抽象工厂模式并画出类图,类图中应包含一个抽象工厂类 AbstractFactory,PcFact

一、案例背景

计算机包含内存(RAM),CPU 等硬件设备,根据如图所示的“产品等级结构-产品族示意图”,使用抽象工厂模式实现计算机设备创建过程并绘制类图

二、实现步骤

  1. 根据题意,使用抽象工厂模式并画出类图,类图中应包含一个抽象工厂类 AbstractFactory,PcFactory 和 MacFactory 两个具体工厂,CPU,RAM 两个抽象产品类,PcCPU,MacCPU,PcRAM,MacRAM 四个具体产品类。## 根据题意,使用抽象工厂模式并画出类图,类图中应包含一个抽象工厂类 AbstractFactory,PcFactory 和 MacFactory 两个具体工厂,CPU,RAM 两个抽象产品类,PcCPU,MacCPU,PcRAM,MacRAM 四个具体产品类。
  2. 根据类图,实现上述类的具体代码以及用户类 Client 和辅助类 XMLUtil 以实现通过 XML 文件来制造不同的产品
  3. 更改 XML 中的属性,观察用户类是否能使用不同的产品

三、实验结果

  1. 项目UML类图,如下:


2. 项目结构:


3. 详细代码:

抽象工厂类

public abstract class AbstractFactory {

    public abstract Cpu createCpu();
    public abstract Ram createRam();

}

抽象产品类

CPU类:
public abstract class Cpu {

    public void playCpu(){
        System.out.println("CPU!!!");
    }
}

RAM类:
public abstract class Ram {

    public void playRam(){
        System.out.println("RAM!!!");
    }

}

具体工厂类

PcFactory类:
public class PcFactory extends AbstractFactory {

    @Override
    public Cpu createCpu() {
        System.out.println("2020006924使用Pc工厂生产CPU");
        return new PcCpu();
    }

    @Override
    public Ram createRam() {
        System.out.println("2020006924使用Pc工厂生产RAM");
        return new PcRam();
    }
MacFactory
public class MacFactory extends AbstractFactory {

    @Override
    public Cpu createCpu() {
        System.out.println("2020006924在使用MacFactory生产CPU");
        return new MacCpu();
    }

    @Override
    public Ram createRam() {
        System.out.println("2020006924在使用MacFactory生产RAM");
        return new MacRam();
    }

}

具体产品类

PcCpu类,如下:
public class PcCpu extends Cpu {
    @Override
    public void playCpu() {
        System.out.println("!!PcCPU!!");
    }
}
PcRam类,如下:
public class PcRam extends Ram {
    @Override
    public void playRam() {
        System.out.println("!!PcRAM!!");
    }
}
MacCpu类,如下:
public class MacCpu extends Cpu {
    @Override
    public void playCpu() {
        System.out.println("!!!MacCPU!!!");
    }
}
MacRam类,如下:
public class MacRam extends Ram {
    @Override
    public void playRam() {
        System.out.println("!!!MacRAM!!!");
    }
}

配置文件config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<config>
  <className>PcFactory</className>
</config>

XMLUtil类

public class XMLUtil
{
    //该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象
    public static Object getBean()
    {
        try
        {
            //创建文档对象
            DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = dFactory.newDocumentBuilder();
            Document doc;
            doc = builder.parse(new File("config.xml"));
            //获取包含类名的文本节点
            NodeList nl = doc.getElementsByTagName("className");
            Node classNode=nl.item(0).getFirstChild();
            String cName=classNode.getNodeValue();
            //通过类名生成实例对象并将其返回
            Class c=Class.forName(cName);
            Object obj=c.newInstance();
            return obj;
        }
        catch(Exception e)
        {
            e.printStackTrace();
            return null;
        }
    }
}

客户类

public class Client {
    public static void main(String[] args) {
        try{
            AbstractFactory factory = (AbstractFactory) XMLUtil.getBean();
            Cpu cpu = factory.createCpu();
            Ram ram = factory.createRam();
            cpu.playCpu();
            ram.playRam();
        }catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
}
  1. 运行结果

案例总结

抽象工厂模式主要适用于:

  • 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节
  • 系统中有多于一个的产品族,但每次只使用其中某一产品族
  • 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来
  • 产品等级结构稳定,在设计完成之后不会向系统中增加新的产品等级结构或者删除已有的产品等级结构
内容
  • RocketMQ消费者是如何负载均衡的
    RocketMQ消费者是如何负载
    2023-12-09
    摘要:RocketMQ 支持两种消息模式:集群消费( Clustering )和广播消费( Broadcasting )
  • FlashDuty Changelog 2023-09-07 | 新增深色模式与主题配置
    FlashDuty Change
    2023-12-04
    FlashDuty:一站式告警响应平台,前往此地址免费体验!.FlashDuty.现在已经全面支持了深色模式,这为您提供
  • 时尚潮流运动鞋
    时尚潮流运动鞋
    2024-01-15
    时尚潮流运动鞋.时尚潮流运动鞋一直是年轻人喜爱的时尚单品,它不仅舒适耐穿,更是一种个性的象征。随着时尚潮流不断更新,运动
  • 商务休闲领带
    商务休闲领带
    2023-12-31
    商务休闲领带:展现不同的风格.商务休闲领带是男士着装中非常重要的一部分,它不仅可以完美搭配西装,展现出商务精英的睿智和稳
  • 潮流风衣大衣,彰显都市时尚风采
    潮流风衣大衣,彰显都市时尚风采
    2023-12-16
    潮流风衣大衣,彰显都市时尚风采.潮流风衣大衣一直是时尚界备受追捧的单品之一。它既能为我们遮风挡雨,又能为我们穿出时尚感,
  • 萌娃配饰套装,包包、帽子、围巾等,增添宝宝的时尚气息
    萌娃配饰套装,包包、帽子、围巾等
    2024-01-20
    萌娃配饰套装,为宝宝增添时尚气息.宝宝是家庭的小太阳,****们都希望给他们最好的一切。随着时尚的发展,宝宝的时尚潮流也
  • 时尚个性针织毛衣
    时尚个性针织毛衣
    2023-12-11
    时尚个性针织毛衣.时尚个性针织毛衣一直是秋冬季节的必备单品,不仅可以很好地保暖,还能展现出个性与时尚。无论是女性还是男性
  • 优质羊毛大衣,彰显高贵气质
    优质羊毛大衣,彰显高贵气质
    2023-12-21
    优质羊毛大衣,彰显高贵气质.在寒冷的冬季,一件羊毛大衣是让人倍感温暖和时尚的必备单品。羊毛大衣以其温暖、舒适和高贵的气质
  • 时尚商务西服套装
    时尚商务西服套装
    2023-12-16
    时尚商务西服套装.时尚商务西服套装一直是职场男士们必备的时尚单品之一。无论是商务会议、重要场合还是日常办公,一套精致的商
  • 时尚牛仔裤,展现随性休闲风格
    时尚牛仔裤,展现随性休闲风格
    2024-01-10
    时尚牛仔裤,展现随性休闲风格.时尚牛仔裤一直是时装界的宠儿,它不仅兼具舒适与时尚,更能展现出一种随性的休闲风格。无论是搭
  • 休闲宽松T恤衫,释放自在舒适气息
    休闲宽松T恤衫,释放自在舒适气息
    2023-12-26
    休闲宽松T恤衫,释放自在舒适气息.在这个喧嚣的都市中,人们的生活节奏变得越来越快,压力也越来越大。因此,人们更加注重舒适
  • 时尚皮质外套,展现酷帅摩登魅力
    时尚皮质外套,展现酷帅摩登魅力
    2024-01-05
    时尚皮质外套,展现酷帅摩登魅力.时尚和酷帅并不矛盾,皮质外套正是展现这种摩登魅力的最佳选择。无论是潮流的时尚圈还是街头的