我们的最终目的是:不修改工厂,只需添加新的类和配置文件就能实现工厂生产该子类对象。这种开发思路在我们的开发过程中是随处可见的,比如在:Spring , Hibernate,Struts中应用得相当的普遍,理解了这一点对我们学习SSH那是非常的顺手哦!
当然具体的用法需要在实际的项目中来体验和优化!
更详细的介绍请看本Page下载文件:CarFactory_code.rar
package com.cdl.dp.factory2;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.InvalidPropertiesFormatException;
import java.util.Properties;
import java.util.Scanner;
//参考:http://www.blogjava.net/jzgl-ever/archive/2008/07/26/217704.html
//参考:interfaceAndFactory.CarFactory
//参考:package com.cdl.dp.factory;
interface Car {
public void run();
public void stop();
}
class Benz implements Car {
public void run() {
System.out.println("Benz开始启动了。。。。。");
}
public void stop() {
System.out.println("Benz停车了。。。。。");
}
}
class Ford implements Car {
public void run() {
System.out.println("Ford开始启动了。。。");
}
public void stop() {
System.out.println("Ford停车了。。。。");
}
}
class Toyota implements Car {
public void run() {
System.out.println("Toyota开始启动了。。。");
}
public void stop() {
System.out.println("Toyota停车了。。。。");
}
}
// 扩展一个我自己的品牌,O(∩_∩)O哈哈~
class Cdliang implements Car {
public void run() {
System.out.println("Cdliang开始启动了。。。");
}
public void stop() {
System.out.println("Cdliang停车了。。。。");
}
}
class BYD implements Car {
public void run() {
System.out.println("BYD开始启动了。。。");
}
public void stop() {
System.out.println("BYD停车了。。。。");
}
}
class ProduceCar {//通过carClassPath反射,生成一个car实例
public static Car getCarInstance(String carClassPath) {
Car c = null;
try {
c = (Car) Class.forName(carClassPath).newInstance();
// 利用反射得到汽车类型,path.package.ClassName当然我们要捕获异常啦
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return c;
}
}
// 写一个加载XML文件的类,加载后就好供我们的程序使用了噻
class InitProperties {
public static Properties getProperties() {// 静态的方法可以让我们不实例化就直接调用
Properties pro = new Properties();
try {
pro.loadFromXML(new FileInputStream("cdl2.xml"));
} catch (InvalidPropertiesFormatException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(pro);
return pro;
}
}
public class CarFactory {
public static void main(String[] args) {
Properties pro = new Properties();
pro = InitProperties.getProperties();
System.out.println("请输入你要的车品牌:");
Scanner sc = new Scanner(System.in);
String carName = sc.nextLine().trim();
Car c = ProduceCar.getCarInstance((String) pro.get(carName));
if (c != null) {// 如果这类存在那么就调用它的方法
c.run();
c.stop();
} else {
System.out.println("造不了这种汽车。。。");
}
}
}
运行结果:
{Benz=com.cdl.dp.factory2.Benz, Ford=com.cdl.dp.factory2.Ford, BYD=com.cdl.dp.factory2.BYD, Toyota=com.cdl.dp.factory2.Toyota, Cdliang=com.cdl.dp.factory2.Cdliang}
请输入你要的车品牌:
BYD
BYD开始启动了。。。
BYD停车了。。。。
.
分享到:
相关推荐
本实例探讨了如何将工厂模式、反射、配置文件和外观模式这四种概念结合起来,以实现更灵活、可扩展的系统架构。下面将详细阐述这些知识点。 1. **工厂模式**: 工厂模式是一种创建型设计模式,它提供了一种创建...
这样,新增产品时只需增加相应的产品类和具体工厂类,原有工厂类无需修改。每个具体产品都有一个对应的具体工厂,使得系统具有更好的灵活性和可扩展性。 **抽象工厂模式** 进一步扩展了工厂方法模式,用于创建一...
- 这种模式适用于产品种类较少且不常变动的情况,因为如果产品种类增加,就需要修改工厂类,这违背了开闭原则。 2. **工厂方法模式(Factory Method Pattern)**: - 工厂方法模式将对象的创建委托给子类。在抽象...
在这个场景中,我们将讨论如何使用Java的工厂模式来实现对MySQL数据库的增、删、改、查(CRUD)操作。 首先,让我们了解下工厂模式的基本概念。工厂模式是一种创建型设计模式,它提供了一个创建对象的接口,但允许...
对于工厂,我们需要定义一个工厂接口,包含创建产品的方法,以及实现该接口的具体工厂类,它们负责创建对应的产品。 类设计图在设计模式中扮演着重要的角色,它用图形方式清晰地展示了类与类之间的关系,如继承、...
在实际应用中,当需要切换数据库时,只需要更改工厂方法中的数据库类型参数,无需修改调用者代码,这体现了工厂模式的灵活性和可扩展性。同时,由于工厂模式隐藏了具体数据库连接类的实例化过程,使得系统更易于维护...
这样,工厂方法就把类的实例化推迟到了子类,使得代码更加灵活,易于扩展。 在Java等面向对象编程语言中,工厂模式通常包括以下角色: 1. 抽象产品(Product):定义产品的公共接口,所有被创建的对象都必须实现这...
抽象工厂模式是一种设计模式,属于创建型...这样的设计使系统更具扩展性,当需要添加新的产品或工厂时,只需要添加相应的类和配置,而不需要修改现有代码。同时,通过反射的运用,降低了代码的耦合度,提高了灵活性。
工厂方法模式将产品的创建过程进一步抽象化,不再由单一的工厂类负责,而是由每个具体的工厂类负责创建对应的具体产品。这样做的好处是保持了代码的灵活性,符合“开闭原则”,即对扩展开放,对修改关闭。工厂方法...
简单工厂模式的核心思想是通过一个工厂类来负责创建特定类型的对象,客户端只需知道具体的工厂类,而不需要关心具体的对象创建过程。在这个实例中,我们以计算器的实现为例,来阐述简单工厂模式的应用。 首先,我们...
在`configurationDemo`文件中,可能包含了一个简单的Java应用,该应用展示了如何使用Apache Commons Configuration库进行配置文件的【增删改查】操作以及动态加载。通过运行这个案例,我们可以更直观地理解这些功能...
例如,我们可能有一个配置文件,其中指定了要使用的具体工厂类。通过反射,我们可以根据配置信息加载并实例化相应的工厂,从而创建所需的产品,这样提供了更大的灵活性和可扩展性。 接着,我们讨论“抽象工厂模式+...
这样,客户端代码与具体的产品实现解耦,增加新的产品类型只需修改工厂类,而不需要改动客户端代码。 实验四的实践将帮助我们更好地理解工厂模式在实际开发中的应用,以及如何利用它来提高代码的可维护性和可扩展性...
3. 编写Mybatis的Mapper接口和XML配置:定义SQL语句,包括增删改查操作,并通过接口方法进行调用。 4. 创建Service层:处理业务逻辑,如验证数据、计算、事务控制等,Service层通常会调用Mapper接口进行数据库操作。...
- 实践中,简单工厂模式适用于产品种类不多,且不需频繁修改的情况,因为它可能导致类的扩展困难。 2. **工厂方法模式**: - 工厂方法模式将对象的创建委托给子类决定,提供一个创建对象的接口,但由子类决定要...
- **扩展性**:添加新产品类型时,只需要添加新的工厂类,而不需要修改已有的代码。 - **灵活性**:工厂模式提供了更好的封装性,可以根据需求动态选择产品实现。 在Java开发中,设计模式的熟练运用对于提高代码...
通过定义接口和实现具体工厂类,我们可以根据配置信息轻松地在SQL Server和MySQL之间切换,而无需修改业务逻辑代码。这种设计不仅降低了系统的耦合度,还提高了代码的可读性和可维护性,是解决此类问题的一个高效...
- 通过引入配置文件,可以在不修改代码的情况下更换产品实现。 工厂模式有三种常见形态: - 简单工厂模式:由一个静态方法来创建对象,适用于产品种类较少且相对固定的场景。 - 工厂方法模式:将对象的创建委托给...
2. **可扩展性**:增加新的产品类型时,只需添加新的具体产品类和对应的具体工厂类,无须修改已有代码。 3. **灵活性**:通过更换具体工厂,可以在运行时改变产品的类型。 然而,工厂方法模式也存在一定的缺点: 1....
在这些模式中,工厂模式是一种创建型模式,它提供了一种封装对象创建过程的方法,使得客户端代码无需直接实例化对象,而是通过一个工厂类来间接创建。这样,客户端与具体的产品实现解耦,增强了系统的灵活性和可扩展...