1. 程式人生 > >介面設計模式---工廠設計模式(簡單工廠模式、工廠方法模式、抽象工廠模式)代理模式

介面設計模式---工廠設計模式(簡單工廠模式、工廠方法模式、抽象工廠模式)代理模式

介面設計模式-------工廠設計模式 工廠設計模式分為簡單設計模式和工廠設計模式。

簡單工廠模式 不想把new 放在主方法 專門定義一個類(第三方)用來建立其他類例項(解耦:抽取出來 ,將客戶端建立物件的操作解耦到外部第三方類),被建立的例項通常具有共同的父類。 在我們之前的程式碼中,物件的例項化是在主方法中:

////傳統在主方法中子類為介面例項化物件
interface IDrinkI
{
    void drinkKind();
}
class CoffeeImpl implements IDrinkI
{
    public void drinkKind()
    {
        System.out.println("煮咖啡");
    }
}
class TeaImpl implements IDrinkI
{
    public void drinkKind()
    {
        System.out.println("泡茶");
    }
}
public class Factory1
{
    public static void main(String[] args)
    {
        IDrinkI drink1=new CoffeeImpl();
        drink1.drinkKind(); //子類為介面進行例項化處理
        IDrinkI drink2=new TeaImpl();
        drink2.drinkKind();
    }
}

如果在主方法中new物件,如果之後飲料需要是奶茶,那就需要修改主方法(客戶端),但這並不是我們希望看到的,所以需要定義一個工廠生產飲料(在工廠裡new物件,客戶端只需要告訴想要什麼飲料)。 簡單工廠模式:

/////簡單工廠模式
interface IDrinkI
{
    void drinkKind();
}
class Factory
{
    //Factory是為了生產物件,沒必要例項化一個工廠物件,所以宣告為static,在外用類來呼叫該方法
    public static IDrinkI getInfor(String drinkName)
    {
        System.out.println("請問您需要什麼飲料");
        System.out.println(drinkName);
        if("coffee".equals(drinkName))
        {
            return  new CoffeeImpl();
        }
        else if("tea".equals(drinkName))
        {
            return new TeaImpl();
        }
        return null;
    }
    //此時,根據使用者需求只需要修改Factory這個工廠類即可
}
class CoffeeImpl implements IDrinkI
{
    public void drinkKind()
    {
        System.out.println("煮咖啡");
    }
}
class TeaImpl implements IDrinkI
{
    public void drinkKind()
    {
        System.out.println("泡茶");
    }
}
public class Factory1
{
    public static void main(String[] args)
    {
        if(args.length==0)
        {
            System.out.println("沒有命令列引數,程式退出");
            System.exit(1) ; // 退出程式
        }
        IDrinkI drink1=Factory.getInfor(args[0]);
        drink1.drinkKind();
    }
}

在這裡插入圖片描述 定義工廠類後,根據客戶需求修改Factory類。 簡單工廠模式注組成:

  • 一個抽象產品類
  • N個具體產品類
  • 一個工廠類(負責生產所有具體產品)

工廠方法模式:產品族(優點在於橫向擴充套件) 定義一個用來建立物件的介面,讓子類決定生產哪一個工廠,(每個工廠只生成同類產品,保護性) 工廠方法模式組成:

  • 一個抽象產品類
  • 多個具體產品類
  • 一個抽象工廠
  • 多個具體工廠(每個產品族對應一個具體工廠) 如下面的蘋果生產工廠只生成和蘋果手機,安卓生產工廠只生成安卓手機,就是每個工廠只生成一個產品族,程式碼如下:
////////////工廠方法模式
interface  IPhone {
    void buyPhone();
}
interface  IFactory
{
    IPhone createPhone();  //生產手機
}
class AppleImpl implements IPhone
{
    public void buyPhone()
    {
        System.out.println("買一部蘋果phone");
    }
}
class AnirodImpl implements  IPhone
{
    public void buyPhone()
    {
        System.out.println("買一部安卓phone");
    }
}
class AppleFactImpl implements IFactory  //蘋果工廠
{
    public IPhone createPhone()
    {
        return new AppleImpl();
    }
}
class AnirodFactImp implements IFactory  //安卓工廠
{
    public IPhone createPhone()
    {
        return new AnirodImpl();
    }
}
public class Factory1
{
    public static void main(String[] args)
    {
        IFactory factory1=new AppleFactImpl();
        IPhone phone=factory1.createPhone();
        phone.buyPhone();//買一部蘋果phone
    }
}

抽象工廠--------多個產品線混合 提供一個建立一系列相關或相互依賴物件的介面(抽象工廠,多條生產線),而無需指定他們具體的類。 比如說蘋果工廠還生成macOs作業系統,安卓工廠還生產android作業系統,就是說一個抽象工廠生產相關產品。 工廠方法模式和抽象工廠模式基本類似,可以這樣理解,當工廠生產一個產品族時,即方法工廠模式,而工廠生產2個或2個以上的產品族時是抽象工廠模式。 總結:

  • 簡單工廠模式最大的優點是工廠內有具體的邏輯去判斷生產什麼產品,將類的例項化將給工廠,這樣當我們需要什麼產品只需要修改工廠的呼叫而不需要去修改客戶端,對客戶端來說降低了與具體產品的依賴;
  • 工廠方法模式是簡單工廠的擴充套件,工廠方法模式把原來簡單工廠中實現哪個具體類的邏輯交給了客戶端,有多個工廠,每個工廠只生成同類產品,保護性如果像新增功能只需要修改客戶和新增具體的功能,不用去修改之前的類;
  • 抽象工廠模式進一步擴充套件了工廠方法模式,它把原來的工廠方法模式只生成一個產品族擴充套件成生成相關依賴產品,具有更多的生產線。

介面設計模式----代理模式特點:兩個子類共同實現一個介面,其中一個子類負責真是業務實現,另一個子類完成輔助真實業務主題的操作。 比如說代理買衣服,我們真實的業務是買一件風衣,至於生成風衣和風衣售後是代理操心,代理輔助我們買一件風衣:

/////代理模式

interface ICloths
{
    void buyCloths();  //核心功能是買衣服
}
class RealClothsImpl implements ICloths  //真實業務
{
    public void buyCloths()
    {
        System.out.println("買一件風衣");
    }
}
class ProClothsImpl implements ICloths  //代理業務
{
    private ICloths cloths;
    public ProClothsImpl(ICloths cloths)  //向上轉型
    {
        this.cloths=cloths;
    }
    public void beforeBuy()
    {
        System.out.println("生產風衣");
    }
    public void afterBuy()
    {
        System.out.println("生產風衣售後團隊");
    }
    public void buyCloths()
    {
        this.beforeBuy();   //業務辦理前操作
        this.cloths.buyCloths();  //呼叫真實業務辦理
        this.afterBuy();   //業務辦理後操作
    }
}
class Factory   //工廠生產物件
{
    public static ICloths getInfor()
    {
        return new ProClothsImpl(new RealClothsImpl()); //proClothsImpl輔助真實業務
    }
}
public class Factory1
{
    public static void main(String[] args)
    {
        ICloths cloths=Factory.getInfor();
        cloths.buyCloths();
    }
}

在這裡插入圖片描述 代理模式的本質:所有的真實業務操作都會有一個與之輔助的工具類(功能類)共同完成。