無廢話設計模式(1)--簡單工廠、工廠方法、抽象工廠


0-前言

  簡單工廠、工廠方法、抽象工廠都是創建型的設計模式,三個設計模式都是工廠的變種,不復雜,下面我們來快速學習這三種;

1-簡單工廠模式

  太簡單,UML圖就不畫了,直接上代碼:

//-----------------1、簡單工廠------------
//1-1、生產者父類
class PhoneMaker
{
    public void  getPhone(){}
}
//1-2、具體生產者
class IphoneMaker extends PhoneMaker
{
    @Override
    public void getPhone()
    {
        System.out.println("生產出了蘋果手機");
    }
}
class HuaweiMaker extends PhoneMaker
{
    @Override
    public void getPhone()
    {
        System.out.println("生產出了華為手機");
    }
}

//1-3 工廠
class PhoneFactory
{
    public  PhoneMaker makePhone(int phoneType)
    {
        PhoneMaker pm = null;
        switch (phoneType)
        {
            case 1:
                pm=new IphoneMaker();
                break;
            case 2:
                pm=new HuaweiMaker();
                break;
            default :
                    break;

        }
        return pm;
    }
}

客戶端:

        //1、簡單工廠模式
        PhoneFactory pf=new PhoneFactory();
        PhoneMaker pm = pf.makePhone(1);
        pm.getPhone();

優缺點:

優點
(1)簡單工廠包含必要的判斷邏輯,簡單工廠實現了對象的創建和使用的分離。
(2)客戶端無需知道所創建的具體產品類的類名,只需要具體產品類對應的參數即可!
(3)在不修改任何客戶端代碼的情況下更換和增加新的具體產品類,在一定程度上提高了系統的靈活性

缺點
(1)工廠類的職責過重,包含邏輯判斷語句,它一旦有問題,整個系統都要出問題(2)在添加新的類的時候,簡單工廠類就要修改,違反了開放——封閉原則!

2-工廠方法模式

同樣,直接上代碼:
//----------------2、工廠方法模式---------------------
//生產者接口
interface ITVMaker
{
    void getTV();
}
//工廠接口
interface ITVFactory
{
    ITVMaker getTVMaker();
}

//----------------
//具體生產者
class AppleTVMaker implements ITVMaker
{
    @Override
    public void getTV()
    {
        System.out.println("生產出了蘋果電視");
    }
}
class  HuaweiTVMaker implements ITVMaker
{
    @Override
    public void getTV()
    {
        System.out.println("生產出了華為電視");
    }
}
//具體工廠
class AppleTVFactory implements  ITVFactory
{
    @Override
    public ITVMaker getTVMaker()
    {
        return new AppleTVMaker();
    }
}
class HuaweiTVFactory implements ITVFactory
{
    @Override
    public ITVMaker getTVMaker()
    {
        return new HuaweiTVMaker();
    }
}

客戶端:

        //2、工廠方法模式
        //如果要蘋果電視
        ITVFactory  tvf = new AppleTVFactory();
        ITVMaker tvm = tvf.getTVMaker();
        tvm.getTV();
        //如果要華為電視
        // ITVFactory  tvf = new HuaweiTVFactory();

優缺點:

優點:
(1)工廠方法用來創建客戶所需要的產品,同時隱藏了哪種具體產品類將被實例化的細節,用戶只需要要關注工廠,不需要關注創建的細節!
(2)在增加修改新的產品的時候不用修改代碼,只需要增加對應的工廠就好,完全符合開放——封閉性原則!
(3)創建對象的細節完全封裝在具體的工廠內部,而且有了抽象的工廠類,所有的具體工廠都繼承了自己的父類!完美的體現了多態性!

缺點:
(1)在增加新的產品時,也必須增加新的工廠類,會帶來額外的開銷

3-抽象工廠模式

同樣,直接上代碼:
//--------------------3、抽象工廠模式--------------
//產品接口
class BookMaker //產品1
{
    public void makeBook()
    {}
}
class  PenMaker //產品2
{
    public void makePen()
    {}
}
//工廠接口
interface IstudentFactory
{
    BookMaker CreateBookmaker();
    PenMaker CreatPenkmaker();
}
//------實現具體產品
class MinBookMaker extends BookMaker
{
    @Override
    public void makeBook()
    {
        System.out.println("生產了小學課本");
    }
}
class  MinPenMaker extends PenMaker
{
    @Override
    public void makePen()
    {
        System.out.println("生產了小學生用的筆");
    }
}
//  。。。。。產品1234...
//具體工廠
class  MinStudentFactory implements IstudentFactory
{
    @Override
    public BookMaker CreateBookmaker()
    {
        return  new MinBookMaker();
    }

    @Override
    public PenMaker CreatPenkmaker()
    {
        return  new MinPenMaker();
    }
}
//......工廠1234.....

客戶端:

//3、抽象工廠
        IstudentFactory factory = new MinStudentFactory(); //生產小學生的產品系列
        BookMaker bookMaker = factory.CreateBookmaker();
        PenMaker penMaker =factory.CreatPenkmaker();
        bookMaker.makeBook();
        penMaker.makePen();
     //...生產中學生的系列產品.....
     //
IstudentFactory factory = new MiddleStudentFactory();
//----- 3.1 以下是配合反射的抽象工廠------
        String studentType="Min";
        try
        {
           // Class<?> c =Class.forName(this.getClass().getPackage().getName() + studentType + "StudentFactory");
            Class<?> c =Class.forName("com.anson.designpattern.designPattern.MinStudentFactory");
            IstudentFactory studentFactory = (IstudentFactory)c.newInstance();
            BookMaker bookMaker1 = studentFactory.CreateBookmaker();
            PenMaker penMaker1 =studentFactory.CreatPenkmaker();
            bookMaker1.makeBook();
            penMaker1.makePen();
        }
        catch (Exception e)
        {
            System.out.println(e);
        }

優缺點:

增加一個產品族很簡單,而增加一個新的產品就會非常復雜!

4-一句話總結

簡單工廠 : 用來生產同一等級結構中的任意產品。(對於增加新的產品,無能為力)
工廠方法 : 用來生產同一等級結構中的固定產品。(支持增加任意產品)
抽象工廠 : 用來生產不同產品族的全部產品。(對於增加新的產品,無能為力;支持增加產品族)


免責聲明!

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



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