學習過簡單工廠模式,感覺很好用。在創建對象時,可以將復雜的初始化操作從客戶端分離出來,簡化客戶端代碼。大大的減少了代碼修改的難度。而且可以通過參數不同,創建不同的對象。
但是簡單工廠模式也有一些弊端,違背了開放--封閉原則。即如果我們增加了一個產品,對應的工廠也要進行修改,即switch---case中要新增加一些分支條件,不利於擴展。所以就有了下面的工廠方法模式:
工廠方法模式:定義了一個用於創建對象的接口,子類決定實例化哪一個類,工廠方法模式使一個類的實例化延遲到子類。
// 設計模式Demo.cpp : 定義控制台應用程序的入口點。 // #include "stdafx.h" #include#include using namespace std; //被創建的對象基類動物類 class Animal { public: virtual void func() = 0; }; //子類 鳥 class Bird : public Animal { public: void func()override { cout<<"I am a bird. I can fly!"< Create()->func(); //創建一個鳥類工廠 god = new BirdFactory(); //生成鳥類對象,並執行操作 god->Create()->func(); getchar(); return 0; }
結果:
I am a human. I can walk!
I am a bird. I can fly!
使用工廠方法模式時,我們定義工廠方法時,只要定義一個接口或者抽象類,子類繼承該接口或者抽象類,具體實現都由子類實現。而且不像簡單工廠模式那樣,需要在工廠中增加判斷條件,在這裡,添加子類的生產方法,只需要從接口或者抽象類再派生一個相關的子工廠類。遵循開放--封閉式原則。