一郭计、面向接口編程
在做一個(gè)項(xiàng)目的時(shí)候霸琴,為了實(shí)現(xiàn)一個(gè)功能,我們總是會(huì)將它先封裝成一個(gè)類--當(dāng)然這是面向?qū)ο笳Z言的共識(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");
}
}
后來發(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中并沒有具體的實(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ù)庫的鏈接湖雹、支付方式的選擇等等躲叼,但是上面的方式依舊存在一些問題复局,例如我們想要調(diào)用Square.draw()必須知道Square這個(gè)類名威创,如果類名錯(cuò)誤則無法實(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();