设计模式(一)简单工厂(创建型)(JavaPHP)
面向對象設計的基本原則????????????????????????????????????????????????????????????????
-
單一職責
系統中的每一個對象應該只有一個單獨的職責,所有對象關注的應該是自身職責的完成。基本思想:高內聚,低耦合。
- 開閉原則
一個對象對擴展開放,對修改關閉。
基本思想:對類的改動是通過增加代碼進行的,而不是修改現有的代碼。 - 里氏替換原則
在任意父類出現的地方,都可以使用子類來替代。 - 依賴注入原則
要依賴于抽象,不要依賴于具體的實現。
基本思想:在開發中盡量的面向接口編程。 - 接口分離原則
不要去使用一些不需要使用的功能。
基本思想:一個接口不要提供太多的行為。 - 迪米特原則
一個對象對其他的對象應該盡可能少的了解。
基本思想:降低耦合。 - 優先使用組合而不是繼承原則
基本思想:在復用對象的時候,要優先考慮組合,而不是繼承。因為父類的任何改變都可能直接音響子類的
設計分類????????????????????????????????????????????????????????????????????????????????????
- 創建型模式:創建對象。
- 結構行模式:對象的組成及對象的關系。
- 行為型模式:對象的行為。對象能夠做什么。
簡單工廠模式????????????????????????????????????????????????????????????????????????????????
簡單工廠模式是指專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。
從圖中我們可以清楚的看到,該模式中主要包含下面3種角色:
- 工廠(Creator)角色
它是工廠模式的核心,負責實現創建所有勢力的內部邏輯。工廠類可以被外界直接調用,創建所需的產品的對象。
- 抽象(Product)角色
簡單工廠模式所創建的所有對象的父類,負責描述所有實例所共有的公共接口。
- 具體產品(Concrete Product)角色
是該模式的創建目標,所有創建的對象都是充當這個角色的某個具體類的實例。一般來講是抽象產品類的子類,實現了抽象產品類中定義的所有接口方法。
舉個例子:
代碼說明一切???????????????????????????????????????????????????????????????????????????????
//Animal.java 抽象產品角色 public abstract class Animal {public abstract void eat(); } //Dog.java 具體產品角色 public class Dog extends Animal {@Overridepublic void eat() {System.out.println("dog eat");}} //Pig.java 具體產品角色 public class Pig extends Animal {@Overridepublic void eat() {System.out.println("pig eat");}} //AnimalFactory.java 工廠角色 public class AnimalFactory {private AnimalFactory(){}public static Animal animalFactory(String string){if(string.equals("dog"))return new Dog();else if(string.equals("pig"))return new Pig();elsereturn null;} } //AnimalTest.java 客戶端調用 public class AnimalTest {public static void main(String[] args) {Animal dog = AnimalFactory.animalFactory("dog");dog.eat();Animal pig = AnimalFactory.animalFactory("pig");pig.eat();Animal ani = AnimalFactory.animalFactory("dog");ani.eat();ani = AnimalFactory.animalFactory("pig");ani.eat();}}優缺點????????????????????????????????????????????????????????????????????????????????????
對象的創建比較復雜的時候,就考慮使用工廠來實現。
優點:在簡單工廠模式中,客戶端不再負責對象的創建,而是把這個責任丟給了工廠類,客戶端值負責對象的調用,從而明確了各個類的職責(單一職責)。
缺點:由于這個工廠類負責所以的對象的創建,那么當子類不斷增多的時候,我們就需要去修改工廠的代碼,這樣就違反了開閉原則。
PHP ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
<?phpdefine('DB_TYPE','pdo');interface IDB{function select();}class DBMysql implements IDB{private $tableName;private $link;function __construct($tableName){$this->tableName=$tableName;$this->link=mysql_connect('localhost','root','');mysql_select_db('base',$this->link);}function select(){//從數據庫中獲取數據$sql="select * from {$this->tableName}";$result=mysql_query($sql);if($result && mysql_num_rows($result)>0){while($row=mysql_fetch_assoc($result)){$data[]=$row;}return $data;}else{return false;}}}class DBPdo implements IDB{private $tableName;private $handler;function __construct($tableName){$this->tableName=$tableName;$dsn="mysql:host=localhost;dbname=ztz";$this->handler=new Pdo($dsn,'root','');}function select(){//從數據庫中獲取數據$sql="select * from {$this->tableName}";$stmt=$this->handler->query($sql);return $stmt->fetchAll(PDO::FETCH_ASSOC);}}class DBFactory{public static function getInstance($tableName='factory'){$class='DB'.DB_TYPE;$obj=new $class($tableName);if($obj instanceof IDB){return $obj;}else{die('該類沒有能實現IDB接口');}}}$m=DBFactory::getInstance();$arr=$m->select();echo "<pre>";print_r($arr);echo "</pre>"; ?>?
PHP的簡單工廠和Java的意思差不多,但是感覺PHP靈活的多。這里是考慮的是數據庫連接,如果換服務器,數據庫也跟著換了,那么數據庫的連接怎么辦,不可能每次都邊吧,所以這里就用簡單工廠來實現不同數據庫的連接。
我是天王蓋地虎的分割線??????????????????????????????????????????????????????????????
源代碼:http://pan.baidu.com/s/1dD1Qx01
java工廠.zip
本文轉自我愛物聯網博客園博客,原文鏈接:http://www.cnblogs.com/yydcdut/p/3837690.html,如需轉載請自行聯系原作者
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的设计模式(一)简单工厂(创建型)(JavaPHP)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java学习lesson 02
- 下一篇: 实现手电筒Flash Light 关键代