面向對象設計的基本原則
-
單一職責
系統中的每一個對象應該只有一個單獨的職責,所有對象關注的應該是自身職責的完成。基本思想:高內聚,低耦合。
- 開閉原則
一個對象對擴展開放,對修改關閉。
基本思想:對類的改動是通過增加代碼進行的,而不是修改現有的代碼。 - 里氏替換原則
在任意父類出現的地方,都可以使用子類來替代。 - 依賴注入原則
要依賴於抽象,不要依賴於具體的實現。
基本思想:在開發中盡量的面向接口編程。 - 接口分離原則
不要去使用一些不需要使用的功能。
基本思想:一個接口不要提供太多的行為。 - 迪米特原則
一個對象對其他的對象應該盡可能少的了解。
基本思想:降低耦合。 - 優先使用組合而不是繼承原則
基本思想:在復用對象的時候,要優先考慮組合,而不是繼承。因為父類的任何改變都可能直接音響子類的
設計分類
- 創建型模式:創建對象。
- 結構行模式:對象的組成及對象的關系。
- 行為型模式:對象的行為。對象能夠做什么。
簡單工廠模式
簡單工廠模式是指專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。
從圖中我們可以清楚的看到,該模式中主要包含下面3種角色:
- 工廠(Creator)角色
它是工廠模式的核心,負責實現創建所有勢力的內部邏輯。工廠類可以被外界直接調用,創建所需的產品的對象。
- 抽象(Product)角色
簡單工廠模式所創建的所有對象的父類,負責描述所有實例所共有的公共接口。
- 具體產品(Concrete Product)角色
是該模式的創建目標,所有創建的對象都是充當這個角色的某個具體類的實例。一般來講是抽象產品類的子類,實現了抽象產品類中定義的所有接口方法。
舉個例子:
代碼說明一切
//Animal.java 抽象產品角色 public abstract class Animal { public abstract void eat(); }
//Dog.java 具體產品角色 public class Dog extends Animal { @Override public void eat() { System.out.println("dog eat"); } }
//Pig.java 具體產品角色 public class Pig extends Animal { @Override public 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(); else return 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
<?php define('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