软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。其目的是为了提高代码的可重用性、代码的可读性和代码的可靠性。

简单工厂模式 - 基本定义:

简单工厂模式又称之为静态工厂方法,属于创建型模式。在简单工厂模式中,可以根据传递的参数不同,返回不同类的实例。简单工厂模式定义了一个类,这个类专门用于创建其他类的实例,这些被创建的类都有一个共同的父类。

特别说明一下,简单工厂模式并不是23种设计模式其中的一种,但是他是后面工厂模式和抽象工厂模式的原型,所以这里先介绍一下他作为引。先了解简单工厂模式对后面的学习有所帮助。


模式结构:


23种设计模式-简单工厂模式告诉你奶茶怎么买_第1张图片

简单工厂模式UML结构图

模式分析:

Factory:工厂角色。专门用于创建实例类的工厂,提供一个方法,该方法根据传递的参数不同返回不同类的具体实例。

Product:抽象产品角色。为所有产品的父类。

ConcreteProduct:具体的产品角色。

简单工厂模式将对象的创建和对象本身业务处理分离了,可以降低系统的耦合度,使得两者修改起来都相对容易些。当以后实现改变时,只需要修改工厂类即可。

模式举例:

有一个客人想买奶茶,他到找销售员购买一杯奶茶,销售员要根据不同客户的口味,去找配餐员下单,如丝袜奶茶、鸳鸯奶茶等等,销售员并不关心奶茶具体怎么做的,根据客户购买的下单内容得到奶茶,递给客户。

23种设计模式-简单工厂模式告诉你奶茶怎么买_第2张图片

客人买奶茶

模式总结:

优点

1、简单工厂模式实现了对责任的分割,提供了专门的工厂类用于创建对象。

2、客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。

3、通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

缺点

1、由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。

2、使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。

3、系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。

4、简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构

应用场景

1、 工厂类负责创建的对象比较少。

2、 客户端只知道传入工厂类的参数,对于如何创建对象不关心

代码实现

第一步:定义我们销售的产品奶茶。任何奶茶都需要 准备、制作、和完成三个步骤。

PS:创建奶茶接口

package com.leeborn.design.simpleFactory;
/**
 * 奶餐分类负责描述我需要奶茶 
 * @author leeborn
 */
public abstract class TeaMilk {
	public abstract void prepare();
	public abstract void make();
	public abstract void complete();
}

第二步:挑选我们制作各种奶茶的厨师

PS:具体奶茶制作实现类

分别创建两个类:TeaMilkStocking、TeaMilkDuck

package com.leeborn.design.simpleFactory;
// 实现1 丝袜奶茶的厨师
public class TeaMilkStocking extends TeaMilk{
	@Override
	public void prepare() {
		System.out.println("准备丝袜!O(∩_∩)O");	
	}
	@Override
	public void make() {
		System.out.println("制作丝袜奶茶!");		
	}
	@Override
	public void complete() {
		System.out.println("完成丝袜奶茶");
	}
}

package com.leeborn.design.simpleFactory;
// 实现2 鸳鸯奶茶的厨师
public class TeaMilkDuck extends TeaMilk{
	@Override
	public void prepare() {
		System.out.println("准备鸳鸯!O(∩_∩)O");
	}
	@Override
	public void make() {
		System.out.println("制作鸳鸯奶茶!");

	}
	@Override
	public void complete() {
		System.out.println("完成鸳鸯奶茶");
	}
}

第三步:选出奶茶组领班、负责告诉具体哪个厨师干活

package com.leeborn.design.simpleFactory;
import java.time.LocalDateTime;
// 奶茶厨师组 负责人
public class TeaMilkStore {
	private SimpleTeaMilkFactory simpleTeaMilkFactory;
	public TeaMilkStore(SimpleTeaMilkFactory simpleTeaMilkFactory){
		this.simpleTeaMilkFactory = simpleTeaMilkFactory;
	}
	// 制作具体的奶茶
	public void orderTeaMilk(String typePizza){
		System.out.println("开始制作奶茶的种类:"+ typePizza);
		TeaMilk teaMilk = simpleTeaMilkFactory.createTeaMilk(typePizza);
		teaMilk.prepare();
		teaMilk.make();
		teaMilk.complete();
		System.out.println("奶茶制作完成:" + LocalDateTime.now());
	}
}

第四步:制作收银机提供给销售员使用

销售员只需要选择:丝袜奶茶或者鸳鸯奶茶

package com.leeborn.design.simpleFactory;

// 奶茶传参餐员 业务员通过他申请和得到具体的奶茶
public class SimpleTeaMilkFactory {
	public TeaMilk createTeaMilk(String typePizza){
		if (typePizza.equals("DUCK")) {
			return new TeaMilkDuck();
		}
		if (typePizza.equals("STOCKING")) {
			return new TeaMilkStocking();
		}
		else {
			return null;
		}
	}
}

第五步:客户选购奶茶 PS:代码测试

package com.leeborn.design.simpleFactory;
public class test {
	public static void main(String[] args) {
		SimpleTeaMilkFactory simpleTeaMilkFactory = new SimpleTeaMilkFactory();
		TeaMilkStore teaMilkStore = new TeaMilkStore(simpleTeaMilkFactory);

		// 客户下单鸳鸯奶茶
		teaMilkStore.orderTeaMilk("DUCK");
		// 客户下单丝袜奶茶
		teaMilkStore.orderTeaMilk("STOCKING");
	}
}