一、面向接口編程
在做一個項目的時候,為了實現一個功能,我們總是會將它先封裝成一個類--當然這是面向對象語言的共識啊,封裝嘛!例如:我們要實現一個Circle,他的功能是繪制一個圓。于是我們寫了一個類
/**
* Created by FollowWinter on 9/27/16.
*/
public class Circle {
public void draw() {
System.out.println("Circle draw");
}
}
后來發現,我們還需要其他的圖形,比如Square、Rectangle,于是我們就接著寫了兩個類:
/**
* 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");
}
}
添加了這三個之后,我們就發現了一些東西,這三個都是屬于繪制圖形的類,他們之間唯一的不同只是繪制圖形的不同,于是我們抽象出了一個共同的父類:
/**
* Created by FollowWinter on 9/27/16.
*/
public class Shap {
void draw(){}
}
同時讓Circle、Rectangle、Square繼承并且重寫draw方法,這是個好方法,但是這時我們可以看出,Shap中并沒有具體的實現,所以用接口更好,同時也更加的清晰明了。當我們需要添加新的類的時候,只要遵守接口中的方法,便可以編寫出新的功能,但是不改變類的調用形式。
而在調用的時候我們便可以這么調用:
Shap circle=new Circle();
circle.draw();
Shap square=new Square();
square.draw();
Shap rectangle=new Rectangle();
rectangle.draw();
二、工廠方法
如上面向接口的使用地方很多,比如多種數據庫的鏈接、支付方式的選擇等等,但是上面的方式依舊存在一些問題,例如我們想要調用Square.draw()必須知道Square這個類名,如果類名錯誤則無法實例化,所以提出了工廠模式,用于屏蔽類的選擇
添加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;
}
}
}
調用:
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();