常用設計模式——簡單工廠模式

個人整合學習自

  1. 設計模式(菜鳥教程)
  2. youlookwhat大佬的GitHub倉庫

工廠模式

在youlookwhat大佬的Github博客提到工廠模式有好幾種

  1. 靜態工廠模式:也就是常用的XxxUtil.method() 這種公共類的靜態方法,比較簡單。
  2. 簡單工廠模式:通過專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。就是店內直接創建肉夾饃來賣。
  3. 工廠方法模式,將工廠類分爲抽象接口和工廠實現,更滿足開閉原則。
  4. 抽象工廠模式
/**
 * 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;
    }
}
  1. 工廠方法模式,也就是這個菜鳥教程裏面的工廠模式
  2. 抽象工廠模式,下次交代。

簡單工廠模式的一個案例實現

我們將創建一個 Shape 接口和實現 Shape 接口的實體類。下一步是定義工廠類 ShapeFactory。

FactoryPatternDemo,我們的演示類使用 ShapeFactory 來獲取 Shape 對象。它將向 ShapeFactory 傳遞信息(CIRCLE / RECTANGLE / SQUARE),以便獲取它所需對象的類型。
在這裏插入圖片描述
在這裏插入圖片描述

  1. 創建一個接口,這裏用圖形做例子
package xyz.cglzwz.question_bank.factorypattern;

public interface Shape {
	void draw();
}
  1. 創建實現接口的實體類。有矩形、正方形、圓形
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("圓形");
	}
}
  1. 創建一個工廠,生成基於給定信息的實體類的對象。
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;
		}
	}
}
  1. 使用該工廠,通過傳遞類型信息來獲取實體類的對象。
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();
	}
}
  1. 結果輸出
圓形
矩形
正方形
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章