工廠設計模式(三種)詳解


 

什么是工廠設計模式?

工廠設計模式,顧名思義,就是用來生產對象的,在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、抽象工廠用來解決相對復雜的問題,適用於一系列、大批量的對象生產;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM