1. 程式人生 > >建立型模式之簡單工廠模式

建立型模式之簡單工廠模式

工廠模式

  1. 簡單工廠
  2. 工廠方法
  3. 抽象工廠

簡單工廠模式:(Simple Factory pattern)屬於類的創新型模式,又叫靜態工廠方法模式(Static Factory Method Pattern);是通過專門定義一個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。

1. 工廠角色:(SimpleFactory)這是簡單工廠模式的核心,由它負責建立所有的類的內部邏輯,當然工廠類必須能夠被外界呼叫,建立所需要的產品物件。 2. 抽象(IProduct)產品角色:簡單工廠模式所建立的所有物件的父類,注意,這裡的父類可以是介面也可以是抽象類,它負責描述所有例項所共有的公共介面。 3. 具體產品(Concrete Product)角色:簡單工廠所建立的具體例項物件,這些具體的產品往往擁有共同的父類。

簡單工廠模式優點: 直接建立所需例項,無需瞭解物件是如何創造以及如何組織的,有利於整個軟體體系的優化。 簡單工廠模式缺點: 工廠類集中了所有例項的建立邏輯,一旦該工廠出現問題,所有客戶端都將受到牽連。更重要的是違背了“開放封閉原則”。

抽象產品角色:

package com.szxy.LemonSnm;

public interface IFood {
           void eat();   //抽象產品 可以吃
}

具體產品角色1(薯條)

package com.szxy.LemonSnm;
/*
薯條
 */
public class Chips implements IFood{

    @Override
    public void eat() {
        System.out.println("我們吃到了薯條");
    }
}

具體產品角色2(麥香雞)

package com.szxy.LemonSnm;
/*
麥香雞
 */
public class McChickn implements IFood {

    @Override
    public void eat() {
        System.out.println("我們吃到了麥香雞");
    }
}

工廠角色(麥當勞商店)

package com.szxy.LemonSnm;
   /*
   麥當勞
    */
public class McDonlad {
          public IFood getFood(String name){
                   switch(name){
                       case "chip":
                        return new Chips();
                       case "mcChicken":
                           return new McChickn();
                           default:
                               System.out.println("不能提供此產品");
                               return null;
                   }
          }
}

客戶端測試

package com.szxy.LemonSnm;

public class Client {
    public static void main(String[] args) {
        System.out.println("this is Simple Factory main");

        McDonlad mcDonlad = new McDonlad(); //建立麥當勞商店
        IFood food = mcDonlad.getFood("chip");//購買薯條
        if (food !=null){
            food.eat();
        }

        food = mcDonlad.getFood("mcChicken");//購買麥香雞
        if (food !=null){
            food.eat();
        }

        food = mcDonlad.getFood("flsChicken");//購買符離集燒雞
        if (food !=null){
            food.eat();
        }
    }
}