Java简单工厂模式

简单工厂模式的简单应用:

问题:

一个农场公式专门负责培育各种水果,在这个系统中的水果有葡萄,香蕉和橘子,其类图如图所示。

请应用简单工厂模式,在主程序中根据键盘输入的水果名称来完成其生长状态描述。

类图如下:



一:java工程目录结构:


二:各个类的代码:

SimpleFactory类:

package factory;

public class SimpleFactory {
	
	public static Fruit getFruitObj(String fruitType){
		Fruit obj = null;
		if(fruitType.equals("Apple")){
			obj = (Fruit) new Apple();
		}else if (fruitType.equals("Orange")) {
			obj=(Fruit) new Orange();
		}else if (fruitType.equals("Banana")) {
			obj=(Fruit) new Banana();
		}		
		
		return obj;
		
	}
Fruit接口:

package factory;

public interface Fruit {
	void plant();	//定义种植方法
	void grow();	//定义生长方法
	void harvest();	//定义收获方法
	
}

Apple类,Orange和Banana类雷同 ,只列出Apple类。
package factory;

public class Apple implements Fruit {

	@Override
	public void plant() {
		// TODO Auto-generated method stub
		System.out.println("面积:种植量达到10万亩地!");
	}

	@Override
	public void grow() {
		// TODO Auto-generated method stub
		System.out.println("生长:受大雨天气影响,生长形势不容乐观");
	}

	@Override
	public void harvest() {
		// TODO Auto-generated method stub
		System.out.println("收获:早熟苹果已经结果!");
	}

	
	
}

Main主函数

package factory;

import java.util.Scanner;

public class Main {
	// 定义全局共享变量
	private static String fruitName;

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		userInput();
		try {
			Fruit fruit = SimpleFactory.getFruitObj(fruitName.toString());
			System.out.println("当前查询的是:" + fruitName);
			fruit.plant();
			fruit.grow();
			fruit.harvest();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			// 这里是避免控制台报空指针错误。
			// e.printStackTrace();
		}

	}

	private static String userInput() {

		// TODO Auto-generated method stub
		Scanner scanner = new Scanner(System.in);
		System.out.println("请用户输入查询的水果名字序号:\n" + "	1:Apple\n" + "	2:Banana\n" + "	3:Orange");
		String fruitNumber = scanner.nextLine();

		// (便于用户输入方便,这里选用输入数字,其实可以直接输水果名字)

		try {
			int number = 0;
			number = Integer.parseInt(fruitNumber);//判断是否输入的是数字。

			switch (number) {
			case 1:
				fruitName = "Apple";
				break;
			case 2:
				fruitName = "Banana";
				break;
			case 3:
				fruitName = "Orange";
				break;
			default:
				System.out.println("没有找到对应的水果,请重新检查输入!!!");
				break;
			}
		} catch (NumberFormatException e1) {
			// TODO Auto-generated catch block
			// 这里避免用户输入的不是数字(例如字母,汉子时)报错。
			System.out.println("输入错误,请重新输入!!!");
		}
		return fruitName;

	}

}


运行结果:



以上就是对简单工厂模式的简单应用了。

详细可看:https://my.oschina.net/kakoi/blog/519294


<think>首先,用户的问题是:“我想了解JAVA简单工厂模式的相关信息 请问JAVA简单工厂模式介绍及使用示例”。这表明用户想了解简单工厂模式的介绍和使用示例。 根据系统级指令: - 所有行内数学表达式使用$...$格式(但在这个问题中,没有数学表达式,所以不用担心)。 - 独立公式使用$$...$$格式(同样,这里可能用不上)。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,例如:[^1]。 用户提供了引用: - 引用[1]:简介了简单工厂模式,定义它属于创建型模式,但不属于23种GOF设计模式之一。描述了它是由一个工厂对象决定创建产品类的实例。 - 引用[2]:类似简介,添加了优点(但优点部分被截断了)。 - 引用[3]:提供了一个使用示例代码,展示了一个动物工厂简单工厂模式实现。 用户上次的问题和回答:没有提供历史,所以我假设这是新对话。 我的回答结构需要清晰: 1. 介绍简单工厂模式。 2. 解释其组成部分。 3. 提供使用示例(基于引用[3])。 4. 自然地添加引用标识。 5. 生成相关问题。 关键点从引用中提取: - 简单工厂模式是创建型模式,又称为静态工厂方法模式。 - 它不属于23种GOF设计模式(GOF指Gamma等人)。 - 核心思想:由一个工厂对象决定创建哪种产品类的实例。 - 是工厂模式家族中最简单实用的模式。 - 包含角色:工厂类(如AnimalFactory)、产品接口(如Animal)、具体产品(如Dog, Cat)。 从引用[3],我可以提取代码示例: - Animal接口(抽象类)。 - Dog和Cat实现Animal。 - AnimalFactory提供静态createAnimal方法。 优点从引用[2]提到(但截断),我可以补充常见优点:简化客户端代码,封装创建逻辑,易于扩展(但简单工厂本身不易扩展)。 我的回答应该: - 用中文。 - 结构清晰:分步解释。 - 保证真实可靠:基于提供的引用和标准知识。 - 末尾生成相关问题。 生成相关问题: - 基于指令:类似示例,生成3个相关问题。 - 例如:如何优化简单工厂模式简单工厂模式的缺点是什么?与工厂方法模式的区别? 最终回答结构: 1. 介绍简单工厂模式。 2. 组成部分。 3. 使用示例(展示代码)。 4. 优点和缺点。 5. 相关引用标识添加到末尾。 6. 生成相关问题。 </think>### JAVA简单工厂模式介绍及使用示例 简单工厂模式是一种创建型设计模式,也称为静态工厂方法模式(Static Factory Method Pattern)。它不属于经典的23种GOF设计模式(由Gamma、Helm、Johnson和Vlissides提出)[^1],但它是工厂模式家族中最简单实用的实现。核心思想是:**由一个工厂对象统一决定创建哪种产品类的实例,封装对象的创建逻辑,简化客户端代码**。下面详细介绍其关键概念和使用示例。 #### 1. 简单工厂模式的核心概念 - **角色定义**: - **工厂类(Factory)**:提供一个静态方法(如`createAnimal`),根据输入参数决定创建哪个具体产品的实例。工厂类通常将构造方法设为私有(`private`),以确保只能通过静态方法创建对象[^3]。 - **产品接口(Product Interface)**:定义一个抽象类或接口(如`Animal`),声明所有产品共有的方法(如`eat()`)。 - **具体产品(Concrete Product)**:实现产品接口的具体类(如`Dog`或`Cat`),每个类代表一种产品类型。 - **工作流程**: 1. 客户端调用工厂类的静态方法,传入一个标识符(如字符串"dog")。 2. 工厂方法内部基于标识符创建并返回对应具体产品的实例。 3. 客户端无需知道具体产品的创建细节,直接使用产品实例。 - **优点**: - **简化客户端代码**:客户端只与工厂交互,无需依赖具体类,降低耦合。 - **封装创建逻辑**:将对象的创建集中在一个地方,便于维护和修改。 - **易于理解**:逻辑简单,适合快速实现小型系统[^2]。 - **缺点**: - **不易扩展**:添加新产品时需要修改工厂类的代码(如添加`if-else`分支),违反了开闭原则。 - **工厂类可能臃肿**:当产品类型增多时,工厂方法会变得复杂。 #### 2. 使用示例(Java代码) 以下示例基于引用[3]的代码,展示一个动物工厂的实现。假设我们有多种动物类型,工厂根据输入创建特定动物对象。 ```java // 产品接口:抽象类Animal,定义所有动物共有的方法 abstract class Animal { public abstract void eat(); // 抽象方法,所有动物必须实现 } // 具体产品:Dog类 class Dog extends Animal { @Override public void eat() { System.out.println("a dog is eating."); // 实现具体行为 } } // 具体产品:Cat类 class Cat extends Animal { @Override public void eat() { System.out.println("a cat is eating."); } } // 工厂类:AnimalFactory,负责创建动物对象 class AnimalFactory { // 私有构造方法,防止外部实例化 private AnimalFactory() {} // 静态工厂方法,根据输入字符串创建对象 public static Animal createAnimal(String animalType) { if ("dog".equals(animalType)) { return new Dog(); // 创建Dog实例 } else if ("cat".equals(animalType)) { return new Cat(); // 创建Cat实例 } else { return null; // 未知类型返回null } } } // 客户端代码:使用工厂创建对象并调用方法 public class FactoryDemo { public static void main(String[] args) { // 通过工厂创建对象 Animal dog = AnimalFactory.createAnimal("dog"); Animal cat = AnimalFactory.createAnimal("cat"); Animal pig = AnimalFactory.createAnimal("pig"); // 未知类型示例 // 使用对象 if (dog != null) { dog.eat(); // 输出: a dog is eating. } else { System.out.println("无法创建"); } if (cat != null) { cat.eat(); // 输出: a cat is eating. } else { System.out.println("无法创建"); } if (pig != null) { pig.eat(); } else { System.out.println("无法创建"); // 输出: 无法创建 } } } ``` - **代码解释**: - 工厂方法`createAnimal`接收一个字符串参数(如"dog"),通过`if-else`分支创建对应的`Dog`或`Cat`对象。 - 客户端(`FactoryDemo`)只需调用工厂方法,不需要了解`Dog`或`Cat`的构造细节。 - 当传入未知类型(如"pig")时,工厂返回`null`,客户端处理错误。 #### 3. 适用场景 - 当系统需要创建少量固定类型对象时(如配置文件解析器或UI控件工厂)。 - 在快速原型开发中,简化对象创建过程。 - 适用于客户端不关心具体类实现的场景[^1][^2]。 简单工厂模式虽然简单,但需注意其扩展性限制。在实际项目中,如果产品类型频繁变化,推荐使用工厂方法模式作为优化方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值