一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - Java設(shè)計模式編程中的工廠方法模式和抽象工廠模式

Java設(shè)計模式編程中的工廠方法模式和抽象工廠模式

2020-03-25 13:44goldensun JAVA教程

這篇文章主要介紹了Java設(shè)計模式編程中的工廠方法模式和抽象工廠模式,設(shè)計模式的建立有利于團隊協(xié)作時代碼的共同維護,需要的朋友可以參考下

工廠方法模式

動機
創(chuàng)建一個對象往往需要復(fù)雜的過程,所以不適合包含在一個復(fù)合工廠中,當(dāng)有新的產(chǎn)品時,需要修改這個復(fù)合的工廠,不利于擴展。

而且,有些對象的創(chuàng)建可以需要用到復(fù)合工廠訪問不到的信息,所以,定義一個工廠接口,通過實現(xiàn)這個接口來決定實例化那個產(chǎn)品,這就是工廠方法模式,讓類的實例化推遲到子類中進行。

目的
1. 定義一個接口,讓子類決定實例化哪個產(chǎn)品。
2. 通過通用接口創(chuàng)建對象。

實現(xiàn)

Java設(shè)計模式編程中的工廠方法模式和抽象工廠模式

1. 產(chǎn)品接口和具體產(chǎn)品很好理解。
2. 工廠類提供一個工廠方法,返回一個產(chǎn)品對象。但是這個工廠方法是抽象的。
3. 具體工廠類實現(xiàn)工廠方法,完成具體產(chǎn)品的創(chuàng)建。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//幾個Button類
class Button{/* ...*/}
class WinButton extends Button{/* ...*/}
class MacButton extends Button{/* ...*/}
  
//它們的工廠類
interface ButtonFactory{
  abstract Button createButton();
}
class WinButtonFactory implements ButtonFactory{
  Button createButton(){
    return new WinButton();
  }
}
class MacButtonFactory implements ButtonFactory{
  Button createButton(){
    return new MacButton();
  }
}

適用場景
1. 創(chuàng)建對象時有比較多重復(fù)的代碼時,可以考慮使用工廠方法模式執(zhí)行這些重復(fù)的部分。
2. 創(chuàng)建對象需要訪問某些信息,而這些信息不應(yīng)該包含在工廠類,那么可以讓子類來實現(xiàn)對象的創(chuàng)建。
3. 需要集中管理對象的創(chuàng)建,保持程序的一致性時。


抽象工廠模式
定義
抽象工廠模式提供了一種方式,可以將一組具有同一主題的單獨的工廠封裝起來。在正常使用中,客戶端程序需要創(chuàng)建抽象工廠的具體實現(xiàn),然后使用抽象工廠作為接口來創(chuàng)建這一主題的具體對象。客戶端程序不需要知道(或關(guān)心)它從這些內(nèi)部的工廠方法中獲得對象的具體類型,因為客戶端程序僅使用這些對象的通用接口。抽象工廠模式將一組對象的實現(xiàn)細(xì)節(jié)與他們的一般使用分離開來。

“工廠”是創(chuàng)建產(chǎn)品(對象)的地方,其目的是將產(chǎn)品的創(chuàng)建與產(chǎn)品的使用分離。抽象工廠模式的目的,是將若干抽象產(chǎn)品的接口與不同主題產(chǎn)品的具體實現(xiàn)分離開。這樣就能在增加新的具體工廠的時候,不用修改引用抽象工廠的客戶端代碼。

使用抽象工廠模式,能夠在具體工廠變化的時候,不用修改使用工廠的客戶端代碼,甚至是在運行時。然而,使用這種模式或者相似的設(shè)計模式,可能給編寫代碼帶來不必要的復(fù)雜性和額外的工作。正確使用設(shè)計模式能夠抵消這樣的“額外工作”。

實現(xiàn)

Java設(shè)計模式編程中的工廠方法模式和抽象工廠模式

1. AbstractFactory - 定義創(chuàng)建抽象產(chǎn)品的接口方法。
2. ConcreteFactory - 實現(xiàn)方法創(chuàng)建具體的產(chǎn)品。
3. AbstractProduct - 聲明不同類型的產(chǎn)品的接口。
4. Product - 定義ConcreteFactory對應(yīng)的具體產(chǎn)品,實現(xiàn)AbstractProduct接口。
5. Client - 使用AbstractFactory和AbstractProduct類。

?
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
abstract class AbstractProductA{
  public abstract void operationA1();
  public abstract void operationA2();
}
 
class ProductA1 extends AbstractProductA{
  ProductA1(String arg){
    System.out.println("Hello "+arg);
  } // Implement the code here
  public void operationA1() { };
  public void operationA2() { };
}
 
class ProductA2 extends AbstractProductA{
  ProductA2(String arg){
    System.out.println("Hello "+arg);
  } // Implement the code here
  public void operationA1() { };
  public void operationA2() { };
}
 
abstract class AbstractProductB{
  //public abstract void operationB1();
  //public abstract void operationB2();
}
 
class ProductB1 extends AbstractProductB{
  ProductB1(String arg){
    System.out.println("Hello "+arg);
  } // Implement the code here
}
 
class ProductB2 extends AbstractProductB{
  ProductB2(String arg){
    System.out.println("Hello "+arg);
  } // Implement the code here
}
 
abstract class AbstractFactory{
  abstract AbstractProductA createProductA();
  abstract AbstractProductB createProductB();
}
 
class ConcreteFactory1 extends AbstractFactory{
  AbstractProductA createProductA(){
    return new ProductA1("ProductA1");
  }
  AbstractProductB createProductB(){
    return new ProductB1("ProductB1");
  }
}
 
class ConcreteFactory2 extends AbstractFactory{
  AbstractProductA createProductA(){
    return new ProductA2("ProductA2");
  }
  AbstractProductB createProductB(){
    return new ProductB2("ProductB2");
  }
}
 
//Factory creator - an indirect way of instantiating the factories
class FactoryMaker{
  private static AbstractFactory pf=null;
  static AbstractFactory getFactory(String choice){
    if(choice.equals("a")){
      pf=new ConcreteFactory1();
    }else if(choice.equals("b")){
            pf=new ConcreteFactory2();
        }
        return pf;
  }
}
 
// Client
public class Client{
  public static void main(String args[]){
    AbstractFactory pf=FactoryMaker.getFactory("a");
    AbstractProductA product=pf.createProductA();
    //more function calls on product
  }
}

FactoryMaker類使用的是簡單工廠模式,而具體工廠的實現(xiàn)用的是工廠方法模式。

適用場景
1. 一個系統(tǒng)要獨立于它的產(chǎn)品的創(chuàng)建、組合和表示時。
2. 一個系統(tǒng)要由多個產(chǎn)品系列中的一個來配置時。
3. 需要強調(diào)一系列相關(guān)的產(chǎn)品對象的設(shè)計以便進行聯(lián)合使用時。
4. 提供一個產(chǎn)品類庫,而只想顯示它們的接口而不是實現(xiàn)時。

優(yōu)點
1. 具體產(chǎn)品從客戶代碼中被分離出來
2. 容易改變產(chǎn)品的系列
3. 將一個系列的產(chǎn)品族統(tǒng)一到一起創(chuàng)建

缺點
1. 在產(chǎn)品族中擴展新的產(chǎn)品是很困難的,它需要修改抽象工廠的接口和具體工廠。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产高清视频一区二区 | 欧美日韩国产中文字幕 | 99视频在线看观免费 | 亚洲欧美综合在线观看 | 韩国久久 | 国色天香论坛社区在线视频 | 免费片在线观看高清 | 精品欧美一区二区三区在线观看 | 青草视频在线观看免费网站 | 99久久国产综合精品女小说 | 亚洲精品老司机福利在线播放 | 成人影院免费在线观看 | 国产趴着打光屁股sp抽打 | 亚洲精品国产SUV | 性xxxx18学生第一次出血 | 久久成人免费大片 | 狠狠干快播 | 久久99精国产一区二区三区四区 | 欧美一区二区三区免费观看视频 | 亚洲精品成人456在线播放 | 国产高清精品自在久久 | 欧美腐剧mm在线观看 | 暖暖的韩国免费观看 | 蜜色影院| 短篇同学新婚h系列小说 | 成人嗯啊视频在线观看 | 国产精品视频2021 | 506070老熟肥妇bbwxx视频 500第一精品 | 韩国日本在线观看 | 天天爱天天做天天爽天天躁 | 精品一区二区三区高清免费观看 | 亚洲视频在线免费观看 | 成人人免费夜夜视频观看 | 久久亚洲电影www电影网 | 国产成人夜色影视视频 | 久久青草免费91线频观看站街 | 大团圆免费阅读全文 | 亚洲视频在线观看免费视频 | 久久久这里有精品999 | 91视频免费网站 | 日韩免费在线视频观看 |