個人整合學習自
工廠模式
在youlookwhat大佬的Github博客提到工廠模式有好幾種
- 靜態工廠模式:也就是常用的XxxUtil.method() 這種公共類的靜態方法,比較簡單。
- 簡單工廠模式:通過專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。就是店內直接創建肉夾饃來賣。
- 工廠方法模式,將工廠類分爲抽象接口和工廠實現,更滿足開閉原則。
- 抽象工廠模式
/**
* Created by jingbin on 2016/10/23.
* 西安 簡單工廠模式:
* 用來西安店生產自己店裏的肉夾饃
*/
public class XianSimpleRoujiaMoFactory {
public RoujiaMo creatRoujiaMo(String type) {
RoujiaMo roujiaMo = null;
switch (type) {
case "Suan":
roujiaMo = new XianSuanRoujiMo();
break;
case "La":
roujiaMo = new XianKuRoujiMo();
break;
case "Tian":
roujiaMo = new XianlaRoujiMo();
break;
default:// 默認爲酸肉夾饃
roujiaMo = new XianSuanRoujiMo();
break;
}
return roujiaMo;
}
}
- 工廠方法模式,也就是這個菜鳥教程裏面的工廠模式
- 抽象工廠模式,下次交代。
簡單工廠模式的一個案例實現
我們將創建一個 Shape 接口和實現 Shape 接口的實體類。下一步是定義工廠類 ShapeFactory。
FactoryPatternDemo,我們的演示類使用 ShapeFactory 來獲取 Shape 對象。它將向 ShapeFactory 傳遞信息(CIRCLE / RECTANGLE / SQUARE),以便獲取它所需對象的類型。
- 創建一個接口,這裏用圖形做例子
package xyz.cglzwz.question_bank.factorypattern;
public interface Shape {
void draw();
}
- 創建實現接口的實體類。有矩形、正方形、圓形
package xyz.cglzwz.question_bank.factorypattern;
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("矩形");
}
}
package xyz.cglzwz.question_bank.factorypattern;
public class Square implements Shape {
@Override
public void draw() {
System.out.println("正方形");
}
}
package xyz.cglzwz.question_bank.factorypattern;
public class Cicle implements Shape {
@Override
public void draw() {
System.out.println("圓形");
}
}
- 創建一個工廠,生成基於給定信息的實體類的對象。
package xyz.cglzwz.question_bank.factorypattern;
/**
* 創建一個形狀製作獲取工廠
*
* @author chgl16
*
*/
public class ShapeFactory {
public Shape getShape(String shapeType) {
// 按照需求創建返回
switch (shapeType) {
case "rectangle" : return new Rectangle();
case "square" : return new Square();
case "cicle" : return new Cicle();
default: return null;
}
}
}
- 使用該工廠,通過傳遞類型信息來獲取實體類的對象。
package xyz.cglzwz.question_bank.factorypattern;
public class App {
public static void main(String[] args) {
// 創建一個工廠實例
ShapeFactory shapeFactory = new ShapeFactory();
// 獲取一個圓形,然後調用其一個方法 (以下都使用接口來聲明引用,這樣不用強制類型轉換,而且鬆耦合)
Shape shape1 = shapeFactory.getShape("cicle");
shape1.draw();
// 獲取一個矩形,然後調用其一個方法
Shape shape2 = shapeFactory.getShape("rectangle");
shape2.draw();
// 獲取一個正方形,然後調用其一個方法
Shape shape3 = shapeFactory.getShape("square");
shape3.draw();
}
}
- 結果輸出
圓形
矩形
正方形