設計模式(一)簡單工廠(創建型)(Java&&PHP)


面向對象設計的基本原則                                                                

  • 單一職責
    系統中的每一個對象應該只有一個單獨的職責,所有對象關注的應該是自身職責的完成。

    基本思想:高內聚,低耦合。

  • 開閉原則
    一個對象對擴展開放,對修改關閉。
    基本思想:對類的改動是通過增加代碼進行的,而不是修改現有的代碼。
  • 里氏替換原則
    在任意父類出現的地方,都可以使用子類來替代。
  • 依賴注入原則
    要依賴於抽象,不要依賴於具體的實現。
    基本思想:在開發中盡量的面向接口編程。
  • 接口分離原則
    不要去使用一些不需要使用的功能。
    基本思想:一個接口不要提供太多的行為。
  • 迪米特原則
    一個對象對其他的對象應該盡可能少的了解。
    基本思想:降低耦合。
  • 優先使用組合而不是繼承原則
    基本思想:在復用對象的時候,要優先考慮組合,而不是繼承。因為父類的任何改變都可能直接音響子類的

設計分類                                                                                    

  • 創建型模式:創建對象。
  • 結構行模式:對象的組成及對象的關系。
  • 行為型模式:對象的行為。對象能夠做什么。

簡單工廠模式                                                                                

簡單工廠模式是指專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。

從圖中我們可以清楚的看到,該模式中主要包含下面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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM