设计模式之简单工厂模式

本文介绍了 Java 中的工厂模式,它是常用的创建型设计模式,可解决创建类实例的重复代码问题,包含简单、方法、抽象三种模式。以简单工厂模式为例,阐述其概念、UML 类图组成、优缺点、实现方式,并给出代码实现及运行结果。

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

一、概念:

​工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式,该模式可以使对象实例的使用者不需要了解该实例是怎么创建的,只需要告诉工厂我要什么,那么工厂就会给你生产对应的对象实例,用于解决创建类的实例出现很多重复代码的场景。其中包含简单工厂模式(Simple Factory),工厂方法模式(Factory Method),抽象工厂模式(Abstract Factory)三种模式,下面以简单工厂模式(Simple Factory)为例进行演示!

 

二、简单工厂模式(Simple Factory)

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。该模式对对象创建管理方式最为简单。该模式是由一个工厂对象决定创建出哪一种产品类的实例。该模式可以理解为是不同工厂模式的一个特殊实现。

其UML类图如下

 

(1)简单工厂模式组成:

http://pic002.cnblogs.com/img/guoshiandroid/201006/2010062300571970.png

工厂角色(Factory):简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。

工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
抽象产品角色(Product):简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品角色(Concrete Product):是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

 

(2)优缺点:

优点:

在于工厂类中包含了必要的逻辑,根据客户需要的条件动态实例化相关的类,对客户端来说,去掉了与具体产品的依赖。

 

缺点:

工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,当增加新的东东时,会违反开放-封闭原则

 

(3)实现方式:

简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。

 

(4)代码实现:

抽象产品类(AbstractProduct):

public abstract class AbstractProduct {
	//抽象产品角色
	public abstract void use();
}

具体产品类(Concrete Product):

public class Plane extends AbstractProduct{
	//具体产品角色(Plane)
	public void use() {
		System.out.println("正在使用飞机");
	}
}
public class Car extends AbstractProduct{
	//具体产品角色(Car)
	public void use() {
		System.out.println("正在使用汽车");
	}
}

工厂类(Factory):

public class Factory {
	//Factory提供一个静态的方法让外部访问并根据传入的参数,动态决定应该创建哪一个产品类
	public static AbstractProduct Product(String product)throws Exception{
		if("plane".equalsIgnoreCase(product)){
			System.out.println("生产飞机");
			return new Plane();
		}else if("artillery".equalsIgnoreCase(product)){
			System.out.println("生产汽车");
			return new Car();
		}else{
			throw new Exception("无法生产此产品!!!");
		}
	}
}

测试类(Text):

public class Text {
	public static void main(String[] args) throws Exception {
		//1.实例化工厂
		Factory factory = new Factory();
		
		//2.调用工厂的produceProduct方法根据传入的参数,动态决定应该创建哪一个产品类
		AbstractProduct producePlane = factory.Product("plane");
		producePlane.use();
		
		System.out.println("--------------------------------------------");

		AbstractProduct produceCar = factory.Product("artillery");
		produceCar.use();
	}
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值