抽象工厂模式的运用

一、案例背景

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

image

二、实现步骤

  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类图,如下:

image
2. 项目结构:

image
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. 运行结果

image

案例总结

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

  • 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节
  • 系统中有多于一个的产品族,但每次只使用其中某一产品族
  • 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来
  • 产品等级结构稳定,在设计完成之后不会向系统中增加新的产品等级结构或者删除已有的产品等级结构
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

街酒jsan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值