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, "记录学习笔记");
// 一切的结束
}
}
执行结果
后记
试想,如果消费者负责生产产品,则消费者和具体产品就有了耦合,如果有一天具体产品的生产方式需要修改(比如,笔的构造器除了颜色还有粗细),所有的消费者都要修改。又或者某一天想使用另外一个具体产品去完成某个功能(比如,想把用黑颜色笔的所有模块从钢笔换成中性笔),则用到该具体产品的地方也都要修改。这是非常不合理的。而使用了工厂,则仅仅会把修改蔓延至工厂。从此也可以看出简单工厂模式,对于扩展来说,并不是不需要修改任何角色,通常作为生产者的工厂是需要修改的。
- 点赞
- 收藏
- 关注作者
评论(0)