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