?
什么是工廠設計模式?
工廠設計模式,顧名思義,就是用來生產對象的,在java中,萬物皆對象,這些對象都需要創建,如果創建的時候直接new該對象,就會對該對象耦合嚴重,假如我們要更換對象,所有new對象的地方都需要修改一遍,這顯然違背了軟件設計的開閉原則,如果我們使用工廠來生產對象,我們就只和工廠打交道就可以了,徹底和對象解耦,如果要更換對象,直接在工廠里更換該對象即可,達到了與對象解耦的目的;所以說,工廠模式最大的優點就是:解耦
本篇主要介紹三種工廠設計模式的使用:
1、簡單工廠
2、工廠方法
3、抽象工廠
簡單工廠設計模式
定義:一個工廠方法,依據傳入的參數,生成對應的產品對象;
角色:
1、抽象產品
2、具體產品
3、具體工廠
4、產品使用者
使用說明:先將產品類抽象出來,比如,蘋果和梨都屬于水果,抽象出來一個水果類Fruit,蘋果和梨就是具體的產品類,然后創建一個水果工廠,分別用來創建蘋果和梨;代碼如下:
android工廠模式。水果接口
public interface Fruit {void whatIm();
}
具體類 蘋果
public class Apple implements Fruit {@Overridepublic void whatIm() {//蘋果}
}
具體類 梨
public class Pear implements Fruit {@Overridepublic void whatIm() {//梨}
}
具體工廠 水果工廠
public class FruitFactory {public Fruit createFruit(String type) {if (type.equals("apple")) {//生產蘋果return new Apple();} else if (type.equals("pear")) {//生產梨return new Pear();}return null;}
}
工廠方法模式和抽象工廠模式的區別。產品使用
FruitFactory mFactory = new FruitFactory();Apple apple = (Apple) mFactory.createFruit("apple");//獲得蘋果Pear pear = (Pear) mFactory.createFruit("pear");//獲得梨
就這樣,一個非常簡單的工廠設計模式就完成了,但是有沒有發現什么問題呢?
對,那就是如果我想吃香蕉,想吃橘子呢,我萬一什么都想吃呢??所以,以上的這種方式,每當我想添加一種水果,就必然要修改工廠類,這顯然違反了開閉原則,亦不可取;所以簡單工廠只適合于產品對象較少,且產品固定的需求,對于產品變化無常的需求來說顯然不合適;所以我們來看下一種方式;
工廠方法設計模式
定義:將工廠提取成一個接口或抽象類,具體生產什么產品由子類決定;
角色:
抽象產品類
具體產品類
抽象工廠類
具體工廠類
使用說明:和上例中一樣,產品類抽象出來,這次我們把工廠類也抽象出來,生產什么樣的產品由子類來決定;
代碼如下:
水果接口 蘋果類和梨類 代碼和上例一樣
工廠接口
public interface FruitFactory {Fruit createFruit();//生產水果
}
java工廠模式例子、蘋果工廠
public class AppleFactory implements FruitFactory {@Overridepublic Fruit createFruit() {return new Apple();}
}
梨工廠
public class PearFactory implements FruitFactory {@Overridepublic Fruit createFruit() {return new Pear();}
}
使用
AppleFactory appleFactory = new AppleFactory();
PearFactory pearFactory = new PearFactory();
Apple apple = (Apple) appleFactory.createFruit();//獲得蘋果
Pear pear = (Pear) pearFactory.createFruit();//獲得梨
以上這種方式,雖然解耦了,也遵循了開閉原則,但是問題根本還是沒有解決啊,換湯沒換藥,如果我需要的產品很多的話,需要創建非常多的工廠,所以這種方式的缺點也很明顯;
抽象工廠設計模式
java中工廠模式是什么意思、定義:為創建一組相關或者是相互依賴的對象提供的一個接口,而不需要指定它們的具體類。
角色:和工廠方法一樣
抽象工廠和工廠方法的模式基本一樣,區別在于,工廠方法是生產一個具體的產品,而抽象工廠可以用來生產一組相同,有相對關系的產品;重點在于一組,一批,一系列;舉個例子,假如生產小米手機,小米手機有很多系列,小米note、紅米note等;假如小米note生產需要的配件有825的處理器,6英寸屏幕,而紅米只需要650的處理器和5寸的屏幕就可以了;用抽象工廠來實現:
cpu接口和實現類
public interface Cpu {void run();class Cpu650 implements Cpu {@Overridepublic void run() {//625 也厲害}}class Cpu825 implements Cpu {@Overridepublic void run() {//825 處理更強勁}}
}
屏幕接口和實現類
public interface Screen {void size();class Screen5 implements Screen {@Overridepublic void size() {//5寸}}class Screen6 implements Screen {@Overridepublic void size() {//6寸}}
}
工廠接口
public interface PhoneFactory {Cpu getCpu();//使用的cpuScreen getScreen();//使用的屏幕
}
工廠模式有哪幾種?具體工廠實現類:小米手機工廠
public class XiaoMiFactory implements PhoneFactory {@Overridepublic Cpu getCpu() {return new Cpu.Cpu825();//高性能處理器}@Overridepublic Screen getScreen() {return new Screen.Screen6();//6寸大屏}
}
具體工廠實現類:紅米手機工廠
public class HongMiFactory implements PhoneFactory {@Overridepublic Cpu getCpu() {return new Cpu.Cpu650();//高效處理器}@Overridepublic Screen getScreen() {return new Screen.Screen5();//小屏手機}
}
以上例子可以看出,抽象工廠可以解決一系列的產品生產的需求,對于大批量,多系列的產品,用抽象工廠可以更好的管理和擴展;
三種工廠方式總結:
1、對于簡單工廠和工廠方法來說,兩者的使用方式實際上是一樣的,如果對于產品的分類和名稱是確定的,數量是相對固定的,推薦使用簡單工廠模式;
2、抽象工廠用來解決相對復雜的問題,適用于一系列、大批量的對象生產;