設計模式系列(四)---工廠模式
目錄
- 這是我的部落格目錄,歡迎閱讀
工廠模式的種類
- 工廠模式分為兩類:工廠方法模式和抽象工廠模式
- 簡單工廠是工廠方法模式的一種特例
簡單工廠模式
代碼實作
abstract class Person
{
public abstract void sayHello();
}
class GDPerson extends Person
{
public void sayHello()
{
System.out.println("我是廣東人");
}
}
class BJPerson extends Person
{
public void sayHello()
{
System.out.println("我是北京人");
}
}
class PersonFactory
{
static final int GD=1;
static final int BJ=2;
public static Person createPerson(int area)
{
switch (area)
{
case GD:
return new GDPerson();
case BJ:
return new BJPerson();
default:
return null;
}
}
}
public class Demo5 {
public static void main(String[] args) {
Person gdPerson=PersonFactory.createPerson(PersonFactory.GD);
gdPerson.sayHello();
Person bjPerson=PersonFactory.createPerson(PersonFactory.BJ);
bjPerson.sayHello();
}
}
開放封閉原則
- 開放封閉原則是面向對象原則的核心
- 對擴充開放,意味着需求或變化是們可以對現有代碼進行擴充,以适應新的情況
- 對修改封閉,意味這類一旦設計完成,就可以獨立完成其工作,而不要對類進行任何修改
分析
- 傳入要建立的對象的類型,然根據傳入的類型,建立相應的對象
- 調用者不必知道對象是如何建立的,隻要傳入相應的參數就可以
- 但是,如果這個時候需要添加其他的type,那麼就要增加case,也就是對設計完成的類進行修改,而這樣就違背了開放封閉原則
工廠方法模式
public interface PersonFactory
{
Person createPerson();
}
class GDFactory implements PersonFactory
{
public Person createPerson() {
return new GDPerson();
}
}
class BJFactory implements PersonFactory
{
public Person createPerson()
{
return new BJPerson();
}
}
public class Demo5 {
public static void main(String[] args) {
PersonFactory gdFactory=new GDFactory();
Person gdPerson=gdFactory.createPerson();
PersonFactory bjFactory=new BJFactory();
Person bjPerson=bjFactory.createPerson();
}
}
- 定義一個用于建立對象的接口,讓子類決定執行個體化哪個類,在這裡展現為建立一個PersonFactory接口,根據要執行個體化的類(Person的類型),建立實作這個接口的一個工廠類(BJFactory或者是GDFactory)。
- 這樣的話,當增加一個新的類的時候,不用對一個已經設計完成的類進行修改,這樣就不會破壞開放封閉原則。
- 但是随着類的增多(比如SHPeroson和USAPerson),那麼就要對應建立多個工廠類
抽象工廠模式
abstract class Animal
{
public abstract void sayHello();
}
class Cat extends Animal
{
public void sayHello()
{
System.out.println("瞄");
}
}
public interface Factory
{
Person createPerson();
Animal createAnimal();
}
class Factory1 implements Factory
{
public Person createPerson()
{
return new BJPerson();
}
public Animal createAnimal()
{
return new Cat();
}
}
- 對比工廠方法模式。它與工廠方法唯一的差別就是工廠的接口裡是不再是建立一個類型(不止是Person還有Animal)。
對比
- 可以體會到,建立一個執行個體的時候,我們将判斷的邏輯放到工程的類的内部(switch或者if else)。而工廠方法模式的話,則是将判斷的邏輯轉移到用戶端,要建立什麼類型的執行個體,就建立對應的工廠來擷取對象。
我覺得分享是一種精神,分享是我的樂趣所在,不是說我覺得我講得一定是對的,我講得可能很多是不對的,但是我希望我講的東西是我人生的體驗和思考,是給很多人反思,也許給你一秒鐘、半秒鐘,哪怕說一句話有點道理,引發自己内心的感觸,這就是我最大的價值。(這是我喜歡的一句話,也是我寫部落格的初衷)
作者:jiajun 出處: http://www.cnblogs.com/-new/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。如果覺得還有幫助的話,可以點一下右下角的【推薦】,希望能夠持續的為大家帶來好的技術文章!想跟我一起進步麼?那就【關注】我吧。