了解简单工厂模式之前,首先要先了解下创建型模式,接下来的Java设计模式的学习,将会逐步学习创建型模式下的6种模式。
创建型模式描述如何将对象的创建和使用分离,让用户在使用对象时无须关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展。
在GoF设计模式中包含5种创建型模式,通常将一种非GoF设计模式——简单工厂模式作为学习其他工厂模式的基础。
模式名称 | 定义 | 学习难度 | 使用频率 |
---|---|---|---|
简单工厂模式 | 定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类 | ★★☆☆☆ | ★★★☆☆ |
工厂方法模式 | 定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化,工厂方法模式让一个类的实例化延迟到其子类 | ★★☆☆☆ | ★★★★★ |
抽象工厂模式 | 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类 | ★★★★☆ | ★★★★★ |
建造者模式 | 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以构建不同的表示 | ★★★★☆ | ★★☆☆☆ |
原型模式 | 使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象 | ★★★☆☆ | ★★★☆☆ |
单例模式 | 确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例 | ★☆☆☆☆ | ★★★★☆ |
简单工厂模式并不属于GoF的23种经典设计模式,但通常将它作为学习其他工厂模式的基础。
定义:定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。
由于在简单工厂模式中用于创建实例的方法通常是静态(static)方法,因此简单工厂模式又被称为静态工厂方法模式,是一种类创建型模式。
首先将需要创建的各种不同产品对象的相关代码封装到不同的类中,,这些类称为具体产品类,而将它们公共的代码进行抽象和提取后封装在一个抽象产品类中,每一个具体产品类都是抽象产品类的子类;然后提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的工厂方法,该方法可以根据所传入的参数不同创建不同的具体产品对象;客户端只需调用工厂类的工厂方法并传入相应的参数即可得到一个产品对象。
简单工厂模式包含以下3个角色:
例如,现在有一家面包店,这家面包店就属于简单工厂模式下的工厂,面包店的菜单有许多产品,有面包、蛋糕、披萨,这些都是属于抽象产品角色,只是菜单上的名字,并不是实际产品。当有顾客点餐时,顾客看着菜单点菜,报出的菜名就相当于是客户端传给工厂的参数,工厂根据参数创建出对应的具体产品对象,即面包店根据顾客点的菜单,制作出对应的食物。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-reD1xMrx-1601638036820)(D:\临时文件夹\img\image-20201001163254761.png)]
按如下类图重新编写四则运算的应用程序Calc2(不要在原有程序上修改)。类的内部实现可以不同,类结构必须完全相同。
Clac2.java
import java.util.Scanner;
public class Calc2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入运算符号:");
String sign = scanner.next();
System.out.print("请输入数字1:");
double num1 = scanner.nextDouble();
System.out.print("请输入数字2:");
double num2 = scanner.nextDouble();
Operator product = Factory.getOperator(sign);
System.out.println(product.getResult(num1,num2));
}
}
Factory.java
public class Factory {
//静态工厂方法
public static Operator getOperator(String arg) {
Operator product = null;
if (arg.equalsIgnoreCase("+")) {
product = new Add();
//初始化设置product
}
else if (arg.equalsIgnoreCase("-")) {
product = new Sub();
//初始化设置product
}
else if (arg.equalsIgnoreCase("*")) {
product = new Mul();
//初始化设置product
}
else if (arg.equalsIgnoreCase("/")) {
product = new Div();
//初始化设置product
}
return product;
}
}
Operator.java
public interface Operator{
public double getResult(double num1,double num2);
}
Add.java
public class Add implements Operator{
public double getResult(double num1, double num2) {
return num1+num2;
}
}
Sub.java
public class Sub implements Operator{
public double getResult(double num1, double num2) {
return num1 - num2;
}
}
Mul.java
public class Mul implements Operator{
public double getResult(double num1, double num2) {
return num1 * num2;
}
}
Div.java
public class Div implements Operator{
public double getResult(double num1, double num2) {
return num1 / num2;
}
}
本篇文章参考书籍有:
《Java设计模式》 刘伟——清华大学出版社,2018
作者:阿涛
CSDN博客主页:https://blog.csdn.net/qq_43313113
如有不对的地方,欢迎在评论区指正
欢迎大家关注我,我将持续更新更多的文章