JAVA 设计模式实战,简单工厂模式/静态工厂模式

举报
二当家的白帽子 发表于 2021/08/18 17:55:42 2021/08/18
【摘要】 为什么要有设计模式?一个有价值的系统总是会因为需求的变化而变化,可能是原有需求的修改,也可能是新需求的增加。于是可怜的猿们就得修改原来的代码,不知道大家是否和我一样,非常讨厌修改已有的,更喜欢去做新的。好的架构和设计可以让我们的代码结构具有良好的扩展性,在满足需求变化的同时仅需要修改尽可能少的代码,可以将需求变化对原系统的影响降到很低。设计模式就是人们对于良性架构设计的经验总结。 简单工厂...

为什么要有设计模式?

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


简单工厂模式的类图

在这里插入图片描述


简单工厂模式的例子

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


产品

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

/**
 * 抽象产品:工具接口
 */
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, "记录学习笔记");

		// 一切的结束
	}
}

执行结果

在这里插入图片描述


后记

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。