java設計模式-工廠模式

fightcrap發表於2019-01-03

java設計模式-工廠模式

什麼是工廠模式

工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,並且是通過使用一個共同的介面來指向新建立的物件。

工廠模式的優點

  1. 良好的封裝性,降低模組的耦合性。利用工廠模式,我們可以不在關注類的建立過程,只需要知道建立的條件,不需要關注過程,就可以獲得所需物件
  2. 高擴充套件性。如果要擴充套件新的功能,只需要新生成一個工廠類或者擴充套件,就可以完成。像jdbc連結池,對應不同的驅動,只需要擴充套件驅動,不需要動其他東西。

工廠模式的缺點

沒有一個事物是完美的,擁有那麼多優點的工廠模式又有哪些缺點呢?

  • 增加新的產品等級結構很複雜,需要修改抽象工廠和所有的具體工廠類,對“開閉原則”的支援呈現傾斜性。在一開始我們需要大量的編碼工作去組合工廠,這就增加了很多工作量

工廠模式的應用場景

  • 相同功能,不同處理方式的場景。比如:日誌,jdbc

工廠模式程式碼樣例

樣例背景:簡單的設計一個,生產不同的名字,在中文中有姓和名,名字都是隨機生成的,那麼姓呢,在中文中姓可是有很多的,所以我們可以利用工廠模式,來構建不同姓的名字。

抽象工廠類:

abstract String buildName(Class<? extends SurnameInterface> clas) throws IllegalAccessException, InstantiationException;

     public static String getChinese() {
        String str = null;
        int highPos, lowPos;
        Random random = new Random();
         //區碼,0xA0打頭,從第16區開始,即0xB0=11*16=176,16~55一級漢字,56~87二級漢字
        highPos = (176 + Math.abs(random.nextInt(71)));
        random=new Random();
         //位碼,0xA0打頭,範圍第1~94列
        lowPos = 161 + Math.abs(random.nextInt(94));

        byte[] bArr = new byte[2];
        bArr[0] = (new Integer(highPos)).byteValue();
        bArr[1] = (new Integer(lowPos)).byteValue();
        try {
            //區位碼組合成漢字
            str = new String(bArr, "GBK");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return str;
    }
複製程式碼

程式碼連結

工廠實現類:

@Override
    String buildName(Class<? extends SurnameInterface> clas) throws IllegalAccessException, InstantiationException {
        SurnameInterface surnameInterface=clas.newInstance();
        String surname=surnameInterface.getSurname();
        String name=surname+getChinese();
        System.out.println(name);
        return name;
    }
複製程式碼

程式碼連結

生產類介面:

public interface SurnameInterface {

    String getSurname();
}
複製程式碼

程式碼連結

生產類實現:

public class ZhaoSurname implements SurnameInterface {
    @Override
    public String getSurname() {
        return "趙";
    }
}
複製程式碼
public class ZhengSurname implements SurnameInterface {


    @Override
    public String getSurname() {
        return "鄭";
    }
}
複製程式碼

程式碼連結

Main:

 public static void main(String[] args) throws InstantiationException, IllegalAccessException {
        AbsrractFactory absrractFactory=new NameFactiry();
        absrractFactory.buildName(ZhengSurname.class);
        absrractFactory.buildName(ZhaoSurname.class);
    }
複製程式碼

程式碼連結

這樣我們需要新增一個姓,只需要構建一個生產類,就可以不動原始碼結構,做到我們想要做的事情

工廠模式程式碼UML類圖

工廠模式uml類圖
圖片轉載至:blog.csdn.net/shzm0/artic…

相關文章