引言:简单工厂模式虽然简单,但存在一个很严重的问题:当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同,来创建不同的产品,这必定要修改工厂类的源代码(增加一个新产品类,修改静态工厂方法内部逻辑),那么,为了实现增加新产品而不影响已有代码,工厂方法模式应运而生。
一、工厂方法模式概述
1.定义
定义一个用于创建对象的接口,让子类决定将哪一个类实例化,同时让一个类的实例化延迟到其子类
2.实现功能
工厂方法模式主要解决的问题:实现增加新产品而不影响工厂类源代码(抽象工厂类)
3.设计思想
针对不同的产品,提供不同的工厂,系统提供一个与产品等级结构对应的工厂等级结构,在客户端中判断使用哪个工厂类去创建对象
工厂方法模式提供了一个抽象工厂接口来声明抽象工厂方法,而由子类来具体实现工厂方法,创建具体的产品对象
工厂方法模式结构如图所示:
工厂方法模式包括以下4个角色:
(1)Project(抽象产品)
它是定义产品的接口,产品对象的公共父类
(2)ConcreteProduct(具体产品)
它实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,具体工厂与具体产品一一对应
(3)Factory(抽象工厂):工厂方法模式的核心
在抽象工厂类中,声明了工厂方法,用于返回一个产品,所有创建对象的工厂类都必须实现该接口
(4)ConcreteFactory(具体工厂)
它是抽象工厂类的子类,实现了抽象工厂中定义的工厂方法,并可有客户端调用,返回一个具体产品类的实例
二、工厂方法模式实现
interface Book{ //抽象产品
void printBookName();
}
class TheSea implements Book{ //具体产品
public void printBookName(){
System.out.println("This Book is 《The Sea》");
}
}
class TheLittlePrince implements Book{ //具体产品
public void printBookName(){
System.out.println("This Book is 《The Little Prince》");
}
}
interface BookFactory{ //抽象工厂(用于创建对象的接口,让子类决定将哪一个类实例化,类的实例化延迟到子类)
Book createBook();
}
class FictionBook implements BookFactory{ //具体工厂
public Book createBook() {
return new TheSea();
}
}
class LiterBook implements BookFactory{ //具体工厂
public Book createBook() {
return new TheLittlePrince ();
}
}
public class Client {
public void BuyBook(Book book) {
book.printBookName();
}
public void main(String[] args) {
Client client =new Client();
BookFactory factory=new FictionBook();//判断使用哪个工厂类创建对象
client.BuyBook(factory.createBook());
}
}
1.工厂方法模式针对每个产品提供一个工厂类,在客户端中判断使用哪个工厂类去创建对象
2.在客户端代码中,只需要关心抽象工厂类即可,不同的具体工厂可以创建不同的产品
3.如果想要增加一个TheLife具体产品类,此时就不需要修改工厂类源代码,而是新增一个具体工厂类接口于抽象工厂类(不可以在现有具体工厂类中修改逻辑)
三、工厂方法模式总结
工厂方法模式是简单工厂模式的延伸,它继承了简单工厂模式的优点,弥补了简单工厂模式的不足,工厂方法模式是使用频率最高的设计模式之一
优点:
1.具体工厂方法用来创建客户所需要的产品,同时还向客户隐藏了那种具体产品类将被实例化,用户只需要关心所需产品对应的工厂即可
2.工厂方法模式基于工厂角色和产品角色的多态性设计,它能够让工厂可以自主确定创建何种产品对象
3.加入新产品时,不需要修改抽象工厂,抽象产品,客户端,只要添加一个具体工厂类和具体产品即可,提升系统可扩展性
缺点:
1.引入了抽象层,增加系统实现难度
2.增加新产品时,需要提供与之对应的具体工厂类,给系统带来额外开销