介紹
三大類:產(chǎn)品類——工廠類——客戶類
工廠模式的終極目標(biāo):使客戶類和產(chǎn)品類相互獨(dú)立, 互不依賴, 實(shí)現(xiàn)解耦臭挽!
工廠模式分三類,從上到下逐步抽象化/接口化
1.簡單工廠Simple Factory : 產(chǎn)品類單體系,有接口/抽象類; 工廠類無接口/抽象類
2.工廠方法Factory Method : 產(chǎn)品類單體系,有接口/抽象類; 工廠類有接口/抽象類
3.抽象工廠Abstract Factory : 產(chǎn)品類多體系,有接口/抽象類; 工廠類有接口/抽象類
工廠方法和抽象工廠的區(qū)別只是產(chǎn)品體系類別變多,使得工廠接口方法變多, 它們分界線很模糊
故而不必糾結(jié)工廠模式類型, 只要能實(shí)現(xiàn)代碼解耦灸芳、而且工廠類簡潔、可擴(kuò)展即可奉芦!
一.簡單工廠Simple Factory
// 1.產(chǎn)品類單體系,有接口/抽象類————————————————————————————
public interface class 產(chǎn)品{
//接口方法接口...
}
public class 產(chǎn)品A implements 產(chǎn)品{
public 產(chǎn)品A() {
...
}
//接口方法實(shí)現(xiàn)...
}
public class 產(chǎn)品B implements 產(chǎn)品{
public 產(chǎn)品B(){
...
}
//接口方法實(shí)現(xiàn)...
}
// 2.工廠類無接口/抽象類————————————————————————————
public class 工廠{
public 產(chǎn)品 get產(chǎn)品(int type) {
switch(type) {
case 0:
return new 產(chǎn)品A();
case 1:
return new 產(chǎn)品B();
}
return null;
}
}
// 3.客戶類——————————————————————————————————————————
public class 客戶{
public static void main(String[] args) {
工廠 廠 = new 工廠();
產(chǎn)品 品A = 廠.get產(chǎn)品(0);
產(chǎn)品 品B = 廠.get產(chǎn)品(1);
}
}
二.工廠方法Factory Method
// 1.產(chǎn)品類單體系,有接口/抽象類————————————————————————————
public interface class 產(chǎn)品{
//接口方法定義...
}
public class 產(chǎn)品A implements 產(chǎn)品{
public 產(chǎn)品A() {
...
}
//接口方法實(shí)現(xiàn)...
}
public class 產(chǎn)品B implements 產(chǎn)品{
public 產(chǎn)品B(){
...
}
//接口方法實(shí)現(xiàn)...
}
// 2.工廠類有接口/抽象類————————————————————————————
public interface 工廠 {
產(chǎn)品 get產(chǎn)品();
}
public class 工廠A implements 工廠{
@Override
public 產(chǎn)品 get產(chǎn)品() {
return new 產(chǎn)品A();
}
}
public class 工廠B implements 工廠{
@Override
public 產(chǎn)品 get產(chǎn)品() {
return new 產(chǎn)品B();
}
}
// 3.客戶類————————————————————————————
public class 客戶{
public static void main(String[] args) {
工廠 廠A = new 工廠A();
產(chǎn)品 品A = 廠A.get產(chǎn)品;
工廠 廠B = new 工廠B();
產(chǎn)品 品B = 廠B.get產(chǎn)品;
}
}
三.抽象工廠Abstract Factory
// 1.產(chǎn)品類多體系,有接口/抽象類————————————————————————————
public interface class 產(chǎn)品{
//接口方法定義...
}
public class 產(chǎn)品A implements 產(chǎn)品{
public 產(chǎn)品A() {
...
}
//接口方法實(shí)現(xiàn)...
}
public class 產(chǎn)品B implements 產(chǎn)品{
public 產(chǎn)品B(){
...
}
//接口方法實(shí)現(xiàn)...
}
public interface class 產(chǎn)物{
//接口方法定義...
}
public class 產(chǎn)物A implements 產(chǎn)物{
public 產(chǎn)物A() {
...
}
//接口方法實(shí)現(xiàn)...
}
public class 產(chǎn)物B implements 產(chǎn)物{
public 產(chǎn)物B(){
...
}
//接口方法實(shí)現(xiàn)...
}
// 2.工廠類有接口/抽象類————————————————————————————
public interface 工廠 {
產(chǎn)品 get產(chǎn)品();
產(chǎn)物 get產(chǎn)物();
}
public class 工廠A implements 工廠{
@Override
public 產(chǎn)品 get產(chǎn)品() {
return new 產(chǎn)品A();
}
@Override
public 產(chǎn)物 get產(chǎn)物() {
return new 產(chǎn)物A();
}
}
public class 工廠B implements 工廠{
@Override
public 產(chǎn)品 get產(chǎn)品() {
return new 產(chǎn)品B();
}
@Override
public 產(chǎn)物 get產(chǎn)物() {
return new 產(chǎn)物B();
}
}
// 3.客戶類————————————————————————————
public class 客戶{
public static void main(String[] args) {
工廠 廠A = new 工廠A();
產(chǎn)品 品A = 廠A.get產(chǎn)品;
產(chǎn)品 物A = 廠A.get產(chǎn)物;
工廠 廠B = new 工廠B();
產(chǎn)品 品B = 廠B.get產(chǎn)品;
產(chǎn)品 物B = 廠B.get產(chǎn)物;
}
}
簡書: http://www.reibang.com/p/945396782853
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/72719312
GitHub博客:http://lioil.win/2017/05/24/Factory_Pattern.html
Coding博客:http://c.lioil.win/2017/05/24/Factory_Pattern.html