定義:工廠方法模式又稱為工廠模式,屬于類的創(chuàng)建型模式。在工廠方法模式中,父類負責定義創(chuàng)建對象的公共接口,而子類則負責生成具體的對象,這樣做的目的是將類的實例化操作延遲到子類中完成,即由子類來決定究竟應(yīng)該實例化哪一個類。
在簡單工廠模式中,一個工廠類處于對產(chǎn)品類進行實例化的中心位置,它知道每一個產(chǎn)品類的細節(jié),并決定何時哪一個產(chǎn)品類應(yīng)當被實例化。但是,簡單工廠模式的致命弱點也就是處于核心地位的工廠類。而工廠方法模式,則是創(chuàng)建類多個產(chǎn)品的工廠,從而將產(chǎn)品的創(chuàng)建過程變得分散化,避免簡單工廠模式中核心工廠負擔過重的問題。
參與者:工廠方法模式主要涉及4個參與者:抽象工廠類、實現(xiàn)抽象工廠類的具體工廠類、抽象產(chǎn)品類和實現(xiàn)抽象產(chǎn)品類的具體產(chǎn)品類
一個簡單例子:
仍引用上一篇簡單工廠模式里舉的例子。在原有基礎(chǔ)上,做適當?shù)男薷暮吞砑印?br />
1、在工廠方法模式里,關(guān)于產(chǎn)品部分與簡單工廠模式類似,需要一個抽象產(chǎn)品和多個具體產(chǎn)品。定義SchoolUser抽象類,Teacher和Student類繼承該父類。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//定義抽象產(chǎn)品類,父類
public abstract class SchoolUser {
public String UserName="";
public String UserType="";
public abstract void Describe();
}
////////////////////////////////////////
//定義具體產(chǎn)品Student
public class Student extends SchoolUser{
public Student(){
this.UserName="Tom";
this.UserType="Student";
}
public void Describe(){

System.out.println("User "+this.UserName+" is "+this.UserType);
}
}
///////////////////////////////////////
//定義具體產(chǎn)品Teacher
public class Teacher extends SchoolUser{
public Teacher(){
this.UserName="Peter";
this.UserType="Teacher";
}
public void Describe(){
System.out.println("User "+this.UserName+" is a "+this.UserType);
}
}
2、接下來就是與簡單工廠模式不同的地方了,在簡單工廠模式中所有產(chǎn)品的創(chuàng)建都集中在了一個工廠里,而工廠方法模式則是需要創(chuàng)建多個不同類別的工廠實例的。我們首先定義一個抽象工廠接口,其實工廠方法模式的核心
1
2
3
public interface Factory {
public SchoolUser createUser();
}
3、實現(xiàn)步驟2中的抽象工廠,定義具體的教師工廠和學(xué)生工廠
1
2
3
4
5
6
7
8
9
10
11
public class TeacherFactory implements Factory{
public SchoolUser createUser(){
return new Teacher();
}
}
////////////////////////////////////////////////
public class StudentFactory implements Factory {
public SchoolUser createUser(){
return new Student();
}
}
4、最后,創(chuàng)建客戶端進行使用測試
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Client {
public static void main(String[] args) {
//創(chuàng)建一個學(xué)生工廠,并產(chǎn)生一個學(xué)生實例
Factory factory;
factory = new StudentFactory();
SchoolUser student = factory.createUser();
student.Describe();
//創(chuàng)建一個教師工廠,并產(chǎn)生一個教師 實例
factory = new TeacherFactory();
SchoolUser teacher = factory.createUser();
teacher.Describe();
}
}
5、總結(jié)一下:
在工廠模式方法中,工廠方法用來創(chuàng)建客戶所需要的產(chǎn)品,同時還向客戶隱藏了哪種具體產(chǎn)品類被實例化這一細節(jié)。工廠方法模式的核心是一個抽象工廠類,各種具體工廠類通過抽象工廠類將工廠方法繼承下來?;诠S角色和產(chǎn)品角色的多態(tài)性設(shè)計時工廠方法模式的關(guān)鍵。用戶只需關(guān)心抽象產(chǎn)品和工廠,一旦創(chuàng)建了一個工廠實例,就不用再理會返回的是到底哪一種具體產(chǎn)品,因為產(chǎn)品創(chuàng)建的具體實現(xiàn)細節(jié)已經(jīng)被封裝到了具體工廠里。
工廠模式的另一個優(yōu)點是在 系統(tǒng)中加入新產(chǎn)品時,無需修改抽象工廠和抽象產(chǎn)品提供的接口,無需更改客戶端,也無需更改其他的具體工廠和具體產(chǎn)品,而只需要添加一個具體工廠和具體產(chǎn)品就可以了。這樣,系統(tǒng)的可擴展性非常好。
愛華網(wǎng)



