我们的最终目的是:不修改工厂,只需添加新的类和配置文件就能实现工厂生产该子类对象。这种开发思路在我们的开发过程中是随处可见的,比如在: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停车了。。。。
.
分享到:
相关推荐
这样,新增产品时只需增加相应的产品类和具体工厂类,原有工厂类无需修改。每个具体产品都有一个对应的具体工厂,使得系统具有更好的灵活性和可扩展性。 **抽象工厂模式** 进一步扩展了工厂方法模式,用于创建一...
- 这种模式适用于产品种类较少且不常变动的情况,因为如果产品种类增加,就需要修改工厂类,这违背了开闭原则。 2. **工厂方法模式(Factory Method Pattern)**: - 工厂方法模式将对象的创建委托给子类。在抽象...
在这个场景中,我们将讨论如何使用Java的工厂模式来实现对MySQL数据库的增、删、改、查(CRUD)操作。 首先,让我们了解下工厂模式的基本概念。工厂模式是一种创建型设计模式,它提供了一个创建对象的接口,但允许...
例如,在图形界面设计中,可以有Windows风格的按钮、文本框和滚动条,以及Mac OS风格的对应组件,抽象工厂模式可以确保在不修改客户端代码的情况下,统一更换整个应用程序的界面风格。 #### 六、实现与应用 在实际...
这种方式易于使用,但不利于扩展,因为如果要添加新产品,需要修改工厂类。 2. 工厂方法模式: 工厂方法模式将对象的创建过程封装到子类中,每个子类对应一种产品。这样,当我们需要添加新产品时,只需要创建新的...
在实际应用中,当需要切换数据库时,只需要更改工厂方法中的数据库类型参数,无需修改调用者代码,这体现了工厂模式的灵活性和可扩展性。同时,由于工厂模式隐藏了具体数据库连接类的实例化过程,使得系统更易于维护...
抽象工厂模式是一种设计模式,属于创建型...这样的设计使系统更具扩展性,当需要添加新的产品或工厂时,只需要添加相应的类和配置,而不需要修改现有代码。同时,通过反射的运用,降低了代码的耦合度,提高了灵活性。
工厂方法模式将产品的创建过程进一步抽象化,不再由单一的工厂类负责,而是由每个具体的工厂类负责创建对应的具体产品。这样做的好处是保持了代码的灵活性,符合“开闭原则”,即对扩展开放,对修改关闭。工厂方法...
简单工厂模式的核心思想是通过一个工厂类来负责创建特定类型的对象,客户端只需知道具体的工厂类,而不需要关心具体的对象创建过程。在这个实例中,我们以计算器的实现为例,来阐述简单工厂模式的应用。 首先,我们...
在`configurationDemo`文件中,可能包含了一个简单的Java应用,该应用展示了如何使用Apache Commons Configuration库进行配置文件的【增删改查】操作以及动态加载。通过运行这个案例,我们可以更直观地理解这些功能...
3. 编写Mybatis的Mapper接口和XML配置:定义SQL语句,包括增删改查操作,并通过接口方法进行调用。 4. 创建Service层:处理业务逻辑,如验证数据、计算、事务控制等,Service层通常会调用Mapper接口进行数据库操作。...
- 实践中,简单工厂模式适用于产品种类不多,且不需频繁修改的情况,因为它可能导致类的扩展困难。 2. **工厂方法模式**: - 工厂方法模式将对象的创建委托给子类决定,提供一个创建对象的接口,但由子类决定要...
- **扩展性**:添加新产品类型时,只需要添加新的工厂类,而不需要修改已有的代码。 - **灵活性**:工厂模式提供了更好的封装性,可以根据需求动态选择产品实现。 在Java开发中,设计模式的熟练运用对于提高代码...
通过定义接口和实现具体工厂类,我们可以根据配置信息轻松地在SQL Server和MySQL之间切换,而无需修改业务逻辑代码。这种设计不仅降低了系统的耦合度,还提高了代码的可读性和可维护性,是解决此类问题的一个高效...
抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象集合的接口,而无需指定具体的类。这种模式允许系统独立于如何创建、组合和表示产品对象的细节进行设计,为产品族(一组相关或相互依赖的对象)提供...
- 通过引入配置文件,可以在不修改代码的情况下更换产品实现。 工厂模式有三种常见形态: - 简单工厂模式:由一个静态方法来创建对象,适用于产品种类较少且相对固定的场景。 - 工厂方法模式:将对象的创建委托给...
2. **可扩展性**:增加新的产品类型时,只需添加新的具体产品类和对应的具体工厂类,无须修改已有代码。 3. **灵活性**:通过更换具体工厂,可以在运行时改变产品的类型。 然而,工厂方法模式也存在一定的缺点: 1....
在这些模式中,工厂模式是一种创建型模式,它提供了一种封装对象创建过程的方法,使得客户端代码无需直接实例化对象,而是通过一个工厂类来间接创建。这样,客户端与具体的产品实现解耦,增强了系统的灵活性和可扩展...
(2)客户端无需知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。 (3)通过引入配置文件,可以在不修改任何客户端代码的情况...