工廠方法到抽象工廠模式mysql
設計原則
要依賴抽象,不要依賴具體類sql
簡單工廠模式雖然簡單,但存在一個很嚴重的問題。當系統中須要引入新產品時,因爲靜態工廠方法經過所傳入參數的不一樣來建立不一樣的產品,這一定要修改工廠類的源代碼,將違背「開閉原則」,如何實現增長新產品而不影響已有代碼?工廠方法模式應運而生,本文將介紹第二種工廠模式——工廠方法模式。數據庫
1 什麼是工廠方法模式ide
工廠方法模式(Factory Method Pattern)又稱爲工廠模式,也叫虛擬構造器(Virtual Constructor)模式或者多態工廠(Polymorphic Factory)模式,它屬於類建立型模式。sqlserver
在工廠方法模式中,工廠父類負責定義建立產品對象的公共接口,而工廠子類則負責生成具體的產品對象,這樣作的目的是將產品類的實例化操做延遲到工廠子類中完成,即經過工廠子類來肯定究竟應該實例化哪個具體產品類。測試
2 爲何要用該模式this
在簡單工廠模式中只提供一個工廠類,該工廠類處於對產品類進行實例化的中心位置,它須要知道每個產品對象的建立細節,並決定什麼時候實例化哪個產品類。簡單工廠模式最大的缺點是當有新產品要加入到系統中時,必須修改工廠類,須要在其中加入必要的業務邏輯,這違背了「開閉原則」。.net
此外,在簡單工廠模式中,全部的產品都由同一個工廠建立,工廠類職責較重,業務邏輯較爲複雜,具體產品與工廠類之間的耦合度高,嚴重影響了系統的靈活性和擴展性,而工廠方法模式則能夠很好地解決這一問題。設計
在工廠方法模式中,再也不提供一個統一的工廠類來建立全部的產品對象,而是針對不一樣的產品提供不一樣的工廠,系統提供一個與產品等級結構對應的工廠等級結構。code
3 模式的結構
7017386-4a72e4cf30c1f0c6.png
在工廠方法模式結構圖中包含以下幾個角色:
與簡單工廠模式相比,工廠方法模式最重要的區別是引入了抽象工廠角色,抽象工廠能夠是接口,也能夠是抽象類或者具體類。
視頻課:https://edu.csdn.net/course/detail/30808
4 代碼示例
代碼參考圖:
抽象工廠能夠建立mysql的操做,也能夠建立sqlserver的操做。
定義一個方法,返回IUserDao接口便可,這樣實現交由子類工廠來實現。
4.1 User實體類
//實體類:和數據庫表一致; public class User { //構造方法 public User(int id,string name) { this.id = id; this.name = name; } int id; public int Id { get { return id; } set { id = value; } } string name; public string Name { get { return name; } set { name = value; } } //重寫該類的ToString(){} public string ToString() { return "編號:"+Id+",姓名:"+Name; } }
4.2 IUserDao接口
//這個接口是定義對User類的操做 public interface IUserDao { void addUser(User user); }
4.3 MysqlUserDao實現類
public class MysqlUserDao:IUserDao { public void addUser(User user) { Console.WriteLine(user.ToString()); Console.WriteLine("mysql開始對user表進行操做了"); } }
4.4 SqlserverUserDao實現類
public class SqlserverUserDao:IUserDao { public void addUser(User user) { Console.WriteLine(user.ToString()); Console.WriteLine("sql server開始對user表進行操做了"); } }
4.5 IFactory接口
public interface IFactory { //返回的是IUserDao的接口; IUserDao createUserDao(); //也能夠建立其餘表操做的接口, //這時候是否是工廠與數據庫無關; }
4.6 MysqlFactory實現類
public class MysqlFactory:IFactory { //返回一個接口的對象;接口不能被new,能夠new它的實現類; public IUserDao createUserDao() { return new MysqlUserDao(); } }
4.7 SqlserverFactory實現類
public class SqlserverFactory:IFactory { public IUserDao createUserDao() { return new SqlserverUserDao(); } }
4.8 測試類
class Program { //程序的健壯性更強,擴展性更好!!!支持多數據庫源; static void Main(string[] args) { User user = new User(1,"張三"); //聲明工廠對象; //IFactory factory = new SqlserverFactory(); IFactory factory = new MysqlFactory(); //讓sqlserver工廠對象幹活 IUserDao iu=factory.createUserDao(); //執行增長用戶的操做; iu.addUser(user); Console.Read(); } }
設計完畢以後,開始寫測試類
5 優勢和缺點
5.1 優勢
5.2 缺點
工廠方法模式比起簡單工廠模式更加符合開閉原則。
工廠模式須要額外建立諸多 Factory 類,也會增長代碼的複雜性,並且,每一個 Factory 類只是作簡單的 new 操做,功能很是單薄(只有一行代碼),也不必設計成獨立的類,因此,在這個應用場景下,簡單工廠模式簡單好用,比工廠方法模式更加合適。
6 適用環境