简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

本文介绍了工厂模式的三种类型:简单工厂模式、工厂方法模式和抽象工厂模式,并通过一个汽车品牌制造的例子来阐述其应用场景和优缺点。此外,文章还讨论了策略模式,包括其优点、缺点和适用场景,指出在面对多种相似策略时如何灵活选择。
摘要由CSDN通过智能技术生成

结合简单示例和UML图,讲解工厂模式简单原理。

 

一、引子

话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰)、Bmw(宝马)、Audi(奥迪)),还雇了司机为他开车。不过,爆发户坐车时总是这样:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上 Audi后他说“开奥迪车!”。
你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的!
幸运的是这种有病的现象在OO语言中可以避免了。下面以Java语言为基础来引入我们本文的主题:工厂模式!

二、简介

工厂模式主要是为创建对象提供了接口。工厂模式按照《Java与模式》中的提法分为三类:
1. 简单工厂模式(Simple Factory)
2. 工厂方法模式(Factory Method)
3. 抽象工厂模式(Abstract Factory)
这三种模式从上到下逐步抽象,并且更具一般性。还有一种分类法,就是将简单工厂模式看为工厂方法模式的一种特例,两个归为一类。两者皆可,这本为使用《Java与模式》的分类方法。
在什么样的情况下我们应该记得使用工厂模式呢?大体有两点:
1.在编码时不能预见需要创建哪种类的实例。
2.系统不应依赖于产品类实例如何被创建、组合和表达的细节
工厂模式能给我们的OOD、OOP带来哪些好处呢??

三、简单工厂模式

这个模式本身很简单而且使用在业务较简单的情况下。一般用于小项目或者具体产品很少扩展的情况(这样工厂类才不用经常更改)。
它由三种角色组成:
工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,根据逻辑不同,产生具体的工厂产品。如例子中的Driver类。
抽象产品角色:它一般是具体产品继承的父类或者实现的接口。由接口或者抽象类来实现。如例中的Car接口。
具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现,如例子中的Benz、Bmw类。


来用类图来清晰的表示下的它们之间的关系:



 

 

下面就来给那个暴发户治病:在使用了简单工厂模式后,现在暴发户只需要坐在车里对司机说句:“开车”就可以了。来看看怎么用代码实现的:(为方便起见,所有的类放在一个文件中,故有一个类被声明为public)

 

//抽象产品
abstract class Car{
	private String name;
	
	public abstract void drive();
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}
//具体产品
class Benz extends Car{
	public void drive(){
		System.out.println(this.getName()+"----go-----------------------");
	}
}

class Bmw extends Car{
	public void drive(){
		System.out.println(this.getName()+"----go-----------------------");
	}
}

//简单工厂
class Driver{
	public static Car createCar(String car){
		Car c = null;
		if("Benz".equalsIgnoreCase(car))
			c = new Benz();
		else if("Bmw".equalsIgnoreCase(car))
			c = new Bmw();
		return c;
	}
}

//老板
public class BossSimplyFactory {

	public static void main(String[] args) throws IOException {
		//老板告诉司机我今天坐奔驰
		Car car = Driver.createCar("benz");
		car.setName("benz");
		 //司机开着奔驰出发
		car.drive();
	}
}

 

如果老板要坐奥迪,同理。

 

这便是简单工厂模式了。那么它带了了什么好处呢?
首先,符合现

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值