工厂方法模式——汽车生产问题

这篇博客探讨了如何使用工厂方法模式解决汽车生产问题。通过定义抽象工厂接口(BenzFactory)和具体工厂类(如E260Factory和C180Factory),实现了创建不同型号汽车(如BenzC180和BenzE260)的逻辑。此外,还介绍了如何利用XML配置文件(config.xml)结合反射技术动态选择要生产的汽车类型,并展示了运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

题目要求:

1.代码:

BenzFactory类:抽象的工厂接口

package factory;



public interface BenzFactory { 抽象的工厂 -->生产产品

public abstract Benz createCar();

}

E260Factory类:具体的工厂类

package factory;

public class E260Factory implements BenzFactory {

@Override

public Benz createCar() {

// TODO Auto-generated method stub

return new BenzE260();

}

}

C180Factory类:具体的工厂类

package factory;

public class C180Factory implements BenzFactory {

@Override

public Benz createCar() {

// TODO Auto-generated method stub

return new BenzC180();

}

}

Benz类:抽象的产品接口

package factory;



public interface Benz {

public abstract void carColor();//车辆颜色

public abstract void carSpeed();//车辆速度

public abstract void carPrice();//车辆价格

}

BenzC180类:具体的产品类

package factory;



public class BenzC180 implements Benz {

//重写

@Override

public void carColor() {

// TODO Auto-generated method stub

    System.out.println("BenzC180 carColor :red");



}

@Override

public void carSpeed() {

// TODO Auto-generated method stub

System.out.println("BenzC180 carSpeed :180");

}

@Override

public void carPrice() {

// TODO Auto-generated method stub

System.out.println("BenzC180 carPrice :40w");

}

}

BenzE260类:具体的产品类

package factory;

public class BenzE260 implements Benz {

@Override

public void carColor() {

// TODO Auto-generated method stub

System.out.println("BenzE260 carColor :black");

}

@Override

public void carSpeed() {

// TODO Auto-generated method stub

System.out.println("BenzE260 carSpeed :160");

}

@Override

public void carPrice() {

// TODO Auto-generated method stub

System.out.println("BenzE260 carPrice :30w");

}

}

测试结果见第3问

  1. 创建XMl文件 config.xml:
<?xml version="1.0" encoding="UTF-8"?>

<config>

    <className>C180Factory</className>

</config>

ConfigTest类:

package factory;



import java.io.File;

import java.io.IOException;

import java.lang.reflect.InvocationTargetException;



import javax.xml.parsers.*;



import org.w3c.dom.Document;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import org.xml.sax.SAXException;



public class ConfigTest {



public static void main(String[] args) {

// TODO Auto-generated method stub



try {

//调用 DocumentBuilderFactory.newInstance()

方法得到创建 DOM 解析器的工厂

DocumentBuilderFactory docfactory = DocumentBuilderFactory.newInstance();

//调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象

DocumentBuilder docbuilder = docfactory.newDocumentBuilder();

//调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文 档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了; 把要解析的 XML 文档转化为输入流,

//以便 DOM 解析器解析它

Document doc = docbuilder.parse(new File("config.xml"));

//得到 XML 文档的className

NodeList nlist = doc.getElementsByTagName("className");

//得到节点的子节点

Node node = nlist.item(0).getFirstChild();

//输出

String cname = node.getNodeValue();

            System.out.println("node value: " + cname);

            

            

            //第三步 使用Java反射机制 将类返回

//3.1 通过获取到的类名创建对象类

Class c = Class.forName(cname);

//3.2 使用newInstance生成新的对象

Benz benzcar = null;

@SuppressWarnings("unchecked")

Object obj = c.getDeclaredConstructor().newInstance();

benzcar =  ((C180Factory)obj).createCar();

benzcar.carColor();

benzcar.carPrice();

benzcar.carSpeed();



} catch (ParserConfigurationException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (SAXException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (ClassNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InstantiationException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalAccessException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalArgumentException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InvocationTargetException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (NoSuchMethodException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (SecurityException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}



}

运行结果:

将config.xml移到C:\Users\15597\eclipse-workspace\factory目录下,与src同级目录

运行结果:

node value: C180Factory

BenzC180 carColor :red

BenzC180 carPrice :40w

BenzC180 carSpeed :180

参考:DocumentBuilderFactory解析XML

DocumentBuilderFactory解析XML_懒惰的小肥肥的博客-优快云博客_documentbuilderfactory

在实现第三步反射时:需将config.xml文件中的C180Factory改为factory.C180Factory

即:

<?xml version="1.0" encoding="UTF-8"?>

<config>

    <className>factory.C180Factory</className>

</config>

原因:全限定类名:就是类名全称,带包路径的用点隔开

//第三步 使用Java反射机制 将类返回

//3.1 通过获取到的类名创建对象类

Class c = Class.forName(cname);

//3.2 使用newInstance生成新的对象

Benz benzcar = null;

@SuppressWarnings("unchecked")

Object obj = c.getDeclaredConstructor().newInstance();

benzcar =  ((C180Factory)obj).createCar();

benzcar.carColor();

benzcar.carPrice();

benzcar.carSpeed();

3.TestFactory 测试类:

package factory;



public class TestFactory {



public static void main(String[] args) {

// TODO Auto-generated method stub

BenzFactory factory = null;// 抽象的工厂

Benz benzcar = null; // 抽象的实例



factory = new C180Factory();

benzcar = factory.createCar();

benzcar.carColor();

benzcar.carPrice();

benzcar.carSpeed();

System.out.println("--------------");

factory = new E260Factory();

benzcar = factory.createCar();

benzcar.carColor();

benzcar.carPrice();

benzcar.carSpeed();

}

}

运行结果:

BenzC180 carColor :red

BenzC180 carPrice :40w

BenzC180 carSpeed :180

--------------

BenzE260 carColor :black

BenzE260 carPrice :30w

BenzE260 carSpeed :160

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

吴迪吖(努力)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值