1.什么是简单工厂:
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。使用简单工厂就是定义了一个创建对象的类,由这个类来封装实例化对象的行为。
2.为什么要用简单工厂:
举例,如果我们要实现从控制台输入数据,根据输入的数据不同生成不同的书籍,例如输入C生成C_book,输入java生成Java_Book.
2.1不使用简单工厂模式
Book.java
public interface Book {
public void read();
}
C_Book.java
public class C_Book implements Book {
@Override
public void read() {
System.out.println("读C语言从入门到入土");
}
}
Java_Book.java
public class Java_Book implements Book {
@Override
public void read() {
System.out.println("读java从入门到入土");
}
}
Error_Book.java
public class Error_Book implements Book {
@Override
public void read() {
System.out.println("ERROR");
}
}
Client.java
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String type;
Book book;
type = scan.nextLine();
switch (type) {
case "C":
book = new C_Book();
break;
case "Java":
book = new Java_Book();
break;
default:
book = new Error_Book();
break;
}
book.read();
scan.close();
}
}
2.2使用简单工厂模式
SimpleFactory_Book.java
public class SimpleFactory_Book {
Book createBook(String type){
switch (type) {
case "C":
return new C_Book();
case "Java":
return new Java_Book();
default:
return new Error_Book();
}
}
}
Client.java
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
SimpleFactory_Book sFactory = new SimpleFactory_Book();
String type;
Book book;
type = scan.nextLine();
book = sFactory.createBook(type);
book.read();
scan.close();
}
}
在客户端代码进行输入,通过switch创建相应类型的书是完全没有问题的。为什么要单独分出来一个类来进行对象的创建呢?这是因为要考虑到代码的可修改性与可读性。在不使用简单工厂的客户端代码中,如果增加一种类型的书,需要修改其中的switch语句,而其后的操作是不需要修改的。针对代码优化进行解耦,就要分离其中的变化部分以及不变的部分。当不使用简单工厂类进行创建对象时,需要从客户端中使用switch的代码中直接修改。如果主函数中使用switch的代码地方过多,需要全部修改,这就很容易漏掉某个地方,忘记修改,从而造成程序错误。简单工厂模式就是将这部分创建对象语句分离出来,由这个类来封装实例化对象的行为,修改时只需要修改类中的操作代码,使用时调用该类不需要考虑实例化对象的行为,使得后期代码维护升级更简单方便。