0x001 工廠模式 -- Factory Pattern

一、面向接口編程

在做一個(gè)項(xiàng)目的時(shí)候,為了實(shí)現(xiàn)一個(gè)功能,我們總是會(huì)將它先封裝成一個(gè)類--當(dāng)然這是面向?qū)ο笳Z(yǔ)言的共識(shí)啊,封裝嘛!例如:我們要實(shí)現(xiàn)一個(gè)Circle,他的功能是繪制一個(gè)圓。于是我們寫了一個(gè)類

/**
 * Created by FollowWinter on 9/27/16.
 */
public class Circle {
    public void draw() {
        System.out.println("Circle draw");
    }
}

后來(lái)發(fā)現(xiàn),我們還需要其他的圖形,比如Square、Rectangle,于是我們就接著寫了兩個(gè)類:

/**
 * Created by FollowWinter on 9/27/16.
 */
public class Rectangle {
    public void draw() {
        System.out.println("Rectangle draw");
    }
}

/**
 * Created by FollowWinter on 9/27/16.
 */
public class Square{
    public void draw() {
        System.out.println("Square draw");
    }
}

添加了這三個(gè)之后,我們就發(fā)現(xiàn)了一些東西,這三個(gè)都是屬于繪制圖形的類,他們之間唯一的不同只是繪制圖形的不同,于是我們抽象出了一個(gè)共同的父類:

/**
 * Created by FollowWinter on 9/27/16.
 */
public class Shap {
    void  draw(){}
}

同時(shí)讓Circle、Rectangle、Square繼承并且重寫draw方法,這是個(gè)好方法,但是這時(shí)我們可以看出,Shap中并沒(méi)有具體的實(shí)現(xiàn),所以用接口更好,同時(shí)也更加的清晰明了。當(dāng)我們需要添加新的類的時(shí)候,只要遵守接口中的方法,便可以編寫出新的功能,但是不改變類的調(diào)用形式。
而在調(diào)用的時(shí)候我們便可以這么調(diào)用:

        Shap circle=new Circle();
        circle.draw();
        Shap square=new Square();
        square.draw();
        Shap rectangle=new Rectangle();
        rectangle.draw();

二、工廠方法


如上面向接口的使用地方很多,比如多種數(shù)據(jù)庫(kù)的鏈接、支付方式的選擇等等,但是上面的方式依舊存在一些問(wèn)題,例如我們想要調(diào)用Square.draw()必須知道Square這個(gè)類名,如果類名錯(cuò)誤則無(wú)法實(shí)例化,所以提出了工廠模式,用于屏蔽類的選擇
添加ShapFactory:

    /**
     * Created by FollowWinter on 9/27/16.
     */
    public class ShapeFactory {
    public static final int SHAPE_SQUARE=1;
    public static final int SHAPE_CIRCLE=2;
    public static final int SHAPE_RECTANGLE=3;

    public Shape getShap(int shapType){
        switch (shapType){
            case SHAPE_CIRCLE:
                return new Circle();
            case SHAPE_RECTANGLE:
                return new Rectangle();
            case SHAPE_SQUARE:
                return new Square();
            default:
                return null;
        }

    }
}

調(diào)用:

    ShapeFactory shapeFactory=new ShapeFactory();
    Shape circle2=shapeFactory.getShap(ShapeFactory.SHAPE_CIRCLE);
    circle2.draw();

    Shape square2=shapeFactory.getShap(ShapeFactory.SHAPE_SQUARE);
    square2.draw();

    Shape rectangle2=shapeFactory.getShap(ShapeFactory.SHAPE_RECTANGLE);
    rectangle2.draw();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容