JAVA设计模式-创建模式-工厂模式-简单工厂模式/静态工厂模式

为什么要有设计模式?

一个有价值的系统总是会因为需求的变化而变化,可能是原有需求的修改,也可能是新需求的增加。于是可怜的猿们就得修改原来的代码,不知道大家是否和我一样,非常讨厌修改已有的,更喜欢去做新的。好的架构和设计可以让我们的代码结构具有良好的扩展性,在满足需求变化的同时仅需要修改尽可能少的代码,可以将需求变化对原系统的影响降到很低。
设计模式就是人们对于良性架构设计的经验总结。

简单工厂模式的类图

在这里插入图片描述

简单工厂模式的例子

通常涉及到三个角色,即产品,生产者以及消费者。

产品

产品就是你要用到的工具类,一般有抽象产品和具体产品。抽象产品仅仅定义有什么功能,所以应该是接口,如果有产品的共有行为可以有抽象类,具体产品则应该对抽象产品定义的功能有具体的实现。

/**
 * 抽象产品:工具接口
 */
public interface ITool {
	// 使用工具
	void run(String something);
}
/**
 * 具体产品:书
 */
public class Book implements ITool {
	private final String type;

	public Book(String type) {
		this.type = type;
	}

	@Override
	public void run(String something) {
		System.out.println("阅读一本" + type + "书->" + something);
	}
}
/**
 * 具体产品:钢笔
 */
public class Pen implements ITool {
	private final String color;

	public Pen(String color) {
		this.color = color;
	}

	@Override
	public void run(String something) {
		System.out.println("使用一枝" + color + "钢笔->" + something);
	}
}

生产者

生产者应该负责产品的生产细节,对此应该高内聚,并不关心产品有什么功能,也不关心消费者如何使用产品。

//生产者:工具商店
public class ToolStore {

	/**
	 * 生产工具
	 * @param toolName
	 * @return
	 */
	public static ITool factory(String toolName) {
		switch (toolName) {
			// 笔
			case "黑颜色笔":
				return new Pen("黑色");
				//break;
			case "透明颜色笔":
				return new Pen("透明");
				//break;
				
			// 书
			case "数学书":
				return new Book("数学");
				//break;
			case "无字天书":
				return new Book("无字");
				//break;
				
			default:
				throw new RuntimeException("本店不卖这个工具:" + toolName);
				//break;
		}
	}
}

消费者

消费者是事件的主体,用什么干什么都是消费者的事情。但是产品怎么生产的,和产品具体如何完成事情不应该是消费者关心的事情。消费者向工厂提出需求,仅仅是对接口功能的需求,而工厂返回的是完成功能的具体子类。

/**
 * 消费者:人
 */
public class Person {
	private final String name;

	public Person(String name) {
		this.name = name;
	}

	/**
	 * 使用工具做某事
	 * @param tool
	 * @param something
	 */
	public void doSomeThing(ITool tool, String something) {
		System.out.print(name + ":");
		tool.run(something);
	}

	public static void main(String[] args) {
		// 一切的开始

		// 一个苦逼的猿诞生了
		Person person = new Person("乐意");

		// 此处没花钱,程序的世界,大家都是朋友,要互相帮助
		// 买本书
		ITool book = ToolStore.factory("数学书");
		// 笔也一起买了
		ITool pen = ToolStore.factory("黑颜色笔");

		person.doSomeThing(book, "学习数学知识");
		person.doSomeThing(pen, "记录学习笔记");

		// 一切的结束
	}
}

执行结果

在这里插入图片描述

后记

试想,如果消费者负责生产产品,则消费者和具体产品就有了耦合,如果有一天具体产品的生产方式需要修改(比如,笔的构造器除了颜色还有粗细),所有的消费者都要修改。又或者某一天想使用另外一个具体产品去完成某个功能(比如,想把用黑颜色笔的所有模块从钢笔换成中性笔),则用到该具体产品的地方也都要修改。这是非常不合理的。而使用了工厂,则仅仅会把修改蔓延至工厂。从此也可以看出简单工厂模式,对于扩展来说,并不是不需要修改任何角色,通常作为生产者的工厂是需要修改的。

鸣谢

非常感谢你花时间阅读本文章,本人水平有限,如果有什么说的不对的地方,欢迎指正。欢迎各位留言讨论,希望小伙伴们都能每天进步一点点。

©️2020 CSDN 皮肤主题: 鲸 设计师:meimeiellie 返回首页