Android中工廠方法模式的作用是什么

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)Android中工廠方法模式的作用是什么,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

烏拉特后ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話(huà)聯(lián)系或者加微信:13518219792(備注:SSL證書(shū)合作)期待與您的合作!

一、介紹

工廠方法模式(Factory Pattern),是創(chuàng)建型設(shè)計(jì)模式之一。工廠方法模式是一種結(jié)構(gòu)簡(jiǎn)單的模式,其在我們平時(shí)開(kāi)發(fā)中應(yīng)用很廣泛,也許你并不知道,但是你已經(jīng)使用了無(wú)數(shù)次該模式了,如Android中的Activity里的各個(gè)生命周期方法,以onCreate方法為例,它就可以看作是一個(gè)工廠方法,我們?cè)谄渲锌梢詷?gòu)造我們的View并通過(guò)setContentView返回給framework處理等,相關(guān)內(nèi)容我們下面再講,先看看工廠方法模式定義。

二、定義

定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類(lèi)決定實(shí)例化哪個(gè)類(lèi)。

三、使用場(chǎng)景

在任何需要生成復(fù)雜對(duì)象的地方,都可以使用工廠方法模式。復(fù)雜對(duì)象適合使用工廠模式,用new就可以完成創(chuàng)建的對(duì)象無(wú)需使用工廠模式。

四、模式的簡(jiǎn)單實(shí)現(xiàn)

抽象產(chǎn)品類(lèi):

public abstract class Product {
  /**
   * 產(chǎn)品類(lèi)的抽象方法
   * 由具體的產(chǎn)品類(lèi)去實(shí)現(xiàn)
   * */
  public abstract void method();
}

具體產(chǎn)品類(lèi)A:

public class ConcreteProductA extends Product {
  @Override
  public void method() {
    System.out.println("我是具體的產(chǎn)品A");
  }
}

具體產(chǎn)品類(lèi)B:

public class ConcreteProductB extends Product {
  @Override
  public void method() {
    System.out.println("我是具體的產(chǎn)品B");
  }
}

抽象工廠類(lèi):

public abstract class Factory {
  /**
   * 抽象工廠方法
   * 具體由子類(lèi)實(shí)現(xiàn)
   * 
   * @return 具體的產(chǎn)品對(duì)象
   * */
  public abstract Product createProduct();
}

具體工廠類(lèi):

public class ConcreteFactory extends Factory {
  /**
   * 具體工廠類(lèi)
   * */
  @Override
  public Product createProduct() {
    return new ConcreteProductA();
  }
}

客戶(hù)類(lèi):

public class Client {
  public static void main(String[] args) {
    Factory factory = new ConcreteFactory();
    Product product = factory.createProduct();
    product.method();
  }
}

結(jié)果:

我是具體的產(chǎn)品A

這里的幾個(gè)角色都很簡(jiǎn)單,主要分為四大模塊,一是抽象工廠,其為工廠方法模式的核心;二是具體工廠,其實(shí)現(xiàn)了具體的業(yè)務(wù)邏輯;三是抽象產(chǎn)品,是工廠方法模式所創(chuàng)建的產(chǎn)品的父類(lèi);四是具體產(chǎn)品,為實(shí)現(xiàn)抽象產(chǎn)品的某個(gè)具體產(chǎn)品的對(duì)象。

上述的代碼中我們?cè)贑lient類(lèi)中構(gòu)造了一個(gè)工廠對(duì)象,并通過(guò)其生產(chǎn)了一個(gè)產(chǎn)品對(duì)象,這里我們得到的產(chǎn)品對(duì)象是ConcreteProductA的實(shí)例,如果想得到ConcreteProductB的實(shí)例,更改ConcreteFactory中的邏輯即可:

public class ConcreteFactory extends Factory {
  /**
   * 具體工廠類(lèi)
   * */
  @Override
  public Product createProduct() {
    //return new ConcreteProductA();
    return new ConcreteProductB();
  }
}

這種方式比較常見(jiàn),需要哪一個(gè)產(chǎn)品就生產(chǎn)哪一個(gè),有時(shí)候也可以利用反射的方式更簡(jiǎn)潔的來(lái)生產(chǎn)具體產(chǎn)品對(duì)象,此時(shí),需要在工廠方法的參數(shù)列表中傳入一個(gè)Class類(lèi)來(lái)決定是哪一個(gè)產(chǎn)品類(lèi):

public abstract class Factory {
  /**
   * 抽象工廠方法
   * 具體由子類(lèi)實(shí)現(xiàn)
   * 
   * @param clz 產(chǎn)品對(duì)象類(lèi)類(lèi)型
   * 
   * @return 具體的產(chǎn)品對(duì)象
   * */
  public abstract <T extends Product> T createProduct(Class<T> clz);
}

對(duì)于具體的工廠類(lèi),則通過(guò)反射獲取類(lèi)的示例即可:

public class ConcreteFactory extends Factory {
  /**
   * 具體工廠類(lèi)
   * */
  @SuppressWarnings("unchecked")
  @Override
  public <T extends Product> T createProduct(Class<T> clz) {
    Product product = null;
    try {
      product = (Product) Class.forName(clz.getName()).newInstance();
    } catch (Exception e) {
      e.printStackTrace();
    }
    return (T)product;
  }
}

最后在看看Client中的實(shí)現(xiàn):

public class Client {
  public static void main(String[] args) {
    Factory factory = new ConcreteFactory();
    Product product = factory.createProduct(ConcreteProductB.class);
    product.method();
  }
}

需要哪一個(gè)類(lèi)的對(duì)象就傳入哪一個(gè)類(lèi)的類(lèi)型即可,這種方法比較簡(jiǎn)潔、動(dòng)態(tài),如果你不喜歡這種方式,也可以嘗試為每一個(gè)產(chǎn)品都定義一個(gè)具體的工廠,各司其職。

public class ConcreteFactoryA extends Factory {
  /**
   * 具體工廠類(lèi)
   **/
  @Override
  public Product createProduct() {
    return new ConcreteProductA();
  }
}
public class ConcreteFactoryB extends Factory {
  /**
   * 具體工廠類(lèi)
   **/
  @Override
  public Product createProduct() {
    return new ConcreteProductB();
  }
}
public class Client {
  public static void main(String[] args) {
    Factory factoryA = new ConcreteFactoryA();
    Product productA = factoryA.createProduct();
    productA.method();
    Factory factoryB = new ConcreteFactoryB();
    Product productB = factoryB.createProduct();
    productB.method();
  }
}

像這樣擁有多個(gè)工廠的方式我們稱(chēng)為多工廠方法模式,同樣的,回到我們最初的那個(gè)工廠方法模式,當(dāng)我們的工廠只有一個(gè)的時(shí)候,我們還是為工廠提供了一個(gè)抽象類(lèi),那么,我們是否可以將其簡(jiǎn)化掉呢?如果確定你的工廠類(lèi)只有一個(gè),那么簡(jiǎn)化掉抽象類(lèi)是肯定沒(méi)問(wèn)題的,我們只需要將對(duì)應(yīng)的工廠方法改為靜態(tài)方法即可:

public class Factory {
  /**
   * 具體工廠類(lèi)
   **/
  @Override
  public static Product createProduct() {
    return new ConcreteProductA();
  }
}

像這樣的方式又稱(chēng)為簡(jiǎn)單工廠模式或靜態(tài)工廠模式,它是工廠方法模式的一個(gè)弱化版本。

其實(shí)到這里大家應(yīng)該可以發(fā)現(xiàn),工廠方法模式是完全符合設(shè)計(jì)原則的,其降低了對(duì)象之間的耦合度,而且,工廠方法模式依賴(lài)于抽象的架構(gòu),其將實(shí)例化的任務(wù)交由子類(lèi)去完成,有非常好的擴(kuò)展性。

五、Android源碼中的工廠方法模式

Activity的各種生命周期

ArrayList和HashSet

六、總結(jié)

優(yōu)點(diǎn):

工廠方法模式完全符合設(shè)計(jì)原則,降低了對(duì)象之間的耦合。高層模塊只需要知道產(chǎn)品的抽象類(lèi),其他的實(shí)現(xiàn)都不需要關(guān)心。

良好的封裝性,代碼結(jié)構(gòu)清晰。擴(kuò)展性好。

缺點(diǎn):

每次我們?yōu)楣S方法模式添加新的產(chǎn)品時(shí)就要編寫(xiě)一個(gè)新的產(chǎn)品類(lèi)。同時(shí)還要引入抽象層,這必然會(huì)導(dǎo)致類(lèi)結(jié)構(gòu)的復(fù)雜化,所以,在某些情況比較簡(jiǎn)單時(shí),是否要使用工廠模式,需要設(shè)計(jì)者權(quán)衡利弊了。

上述就是小編為大家分享的Android中工廠方法模式的作用是什么了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當(dāng)前標(biāo)題:Android中工廠方法模式的作用是什么
本文來(lái)源:http://bm7419.com/article42/pccdec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、網(wǎng)站導(dǎo)航商城網(wǎng)站、標(biāo)簽優(yōu)化、動(dòng)態(tài)網(wǎng)站Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)