工厂模式是最常用的一类创建型设计模式。通常说的工厂模式是指工厂方法模式,简单工厂不属于GoF 23 种设计模式,但在开发中使用也极为频繁,通常把它做为学习其他工厂模式的入门
简单工厂模式(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态方法,因此简单工厂又被称为静态工厂方法(Static Factory Method)模式,属于类创建型模式
下面以制作书籍为例,代码演示简单工厂模式
定义一个书籍的抽象类
package com.design.simplefactory;
/**
* 抽象书籍类
*/
public abstract class Book {
public abstract void produce();
}
定义文学书类
package com.design.simplefactory;
/**
* 文学书
*/
public class LiteratureBook extends Book{
public void produce() {
System.out.println("制作文学书籍");
}
}
定义哲学书类
package com.design.simplefactory;
/**
* 哲学书
*/
public class PhilosophyBook extends Book{
public void produce() {
System.out.println("制作哲学书籍");
}
}
定义书籍工厂类
package com.design.simplefactory;
/**
* 工厂类
*/
public class BookFactory {
public Book getBook(String type){
Book book = null;
if ("literature".equals(type)){
book = new LiteratureBook();
}else if ("philosophy".equals(type)){
book = new PhilosophyBook();
}
return book;
}
}
类图如下
定义测试类
package com.design.simplefactory;
public class TestMain {
public static void main(String[] args) {
BookFactory bookFactory = new BookFactory();
//制作哲学书
Book book = bookFactory.getBook("philosophy");
book.produce();
}
}
代码改进
上边的书籍工厂类的方法可以改成静态的,这样就可以直接通过类名进行调用
package com.design.simplefactory;
/**
* 工厂类
*/
public class BookFactory {
public static Book getBook(String type){
Book book = null;
if ("literature".equals(type)){
book = new LiteratureBook();
}else if ("philosophy".equals(type)){
book = new PhilosophyBook();
}
return book;
}
}
可以看出上边的工厂类并不符合开闭原则,随着制作书籍种类的增加,工厂类的代码也要相应增加,为解决这一问题,可以通过反射来提高工厂类的扩展性
package com.design.simplefactory;
/**
* 工厂类
*/
public class BookFactory {
public Book getBook(Class c){
Book book = null;
try {
book = (Book) Class.forName(c.getName()).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return book;
}
}
测试调用
package com.design.simplefactory;
public class TestMain {
public static void main(String[] args) {
BookFactory bookFactory = new BookFactory();
//制作文学书籍
Book book = bookFactory.getBook(LiteratureBook.class);
book.produce();
}
}