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

大叔楊發表於2020-07-31

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-一句話總結

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

相關文章