天天看點

設計模式系列(四)---工廠模式

設計模式系列(四)---工廠模式

目錄

  • 這是我的部落格目錄,歡迎閱讀

工廠模式的種類

  • 工廠模式分為兩類:工廠方法模式和抽象工廠模式
  • 簡單工廠是工廠方法模式的一種特例

簡單工廠模式

代碼實作

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/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。如果覺得還有幫助的話,可以點一下右下角的【推薦】,希望能夠持續的為大家帶來好的技術文章!想跟我一起進步麼?那就【關注】我吧。

繼續閱讀