sqlserver查詢轉日期格式欄位
阿新 • • 發佈:2020-12-07
基本介紹
1) 抽象工廠模式:定義了一個interface用於建立相關或有依賴關係的物件簇,而無需指明具體的類
2) 抽象工廠模式可以將簡單工廠模式和工廠方法模式進行整合。
3) 從設計層面看,抽象工廠模式就是對簡單工廠模式的改進(或者稱為進一步的抽象)。
4) 將工廠抽象成兩層,AbsFactory(抽象工廠) 和 具體實現的工廠子類。程式設計師可以根據建立物件型別使用對應的工廠子類。這樣將單個的簡單工廠類變成了工廠簇,更利於程式碼的維護和擴充套件。
使用抽象工廠模式來完成披薩專案.
類圖:
披薩類:
//將Pizza 類做成抽象 public abstract class Pizza {protected String name; //名字 //準備原材料, 不同的披薩不一樣,因此,我們做成抽象方法 public abstract void prepare(); public void bake() { System.out.println(name + " baking;"); } public void cut() { System.out.println(name + " cutting;"); } //打包 public void box() { System.out.println(name+ " boxing;"); } public void setName(String name) { this.name = name; } }
北京乳酪披薩:
public class BJCheesePizza extends Pizza { @Override public void prepare() { // TODO Auto-generated method stub setName("北京的乳酪pizza"); System.out.println(" 北京的乳酪pizza 準備原材料"); } }
北京胡椒披薩:
public class BJPepperPizza extends Pizza { @Override public void prepare() { // TODO Auto-generated method stub setName("北京的胡椒pizza"); System.out.println(" 北京的胡椒pizza 準備原材料"); } }
倫敦乳酪披薩:
public class LDCheesePizza extends Pizza{ @Override public void prepare() { // TODO Auto-generated method stub setName("倫敦的乳酪pizza"); System.out.println(" 倫敦的乳酪pizza 準備原材料"); } }
倫敦胡椒披薩:
public class LDPepperPizza extends Pizza{ @Override public void prepare() { // TODO Auto-generated method stub setName("倫敦的胡椒pizza"); System.out.println(" 倫敦的胡椒pizza 準備原材料"); } }
抽象層介面:
import com.atguigu.factory.absfactory.pizzastore.pizza.Pizza; //一個抽象工廠模式的抽象層(介面) public interface AbsFactory { //讓下面的工廠子類來 具體實現 public Pizza createPizza(String orderType); }
工廠子類:(北京的)
import com.atguigu.factory.absfactory.pizzastore.pizza.BJCheesePizza; import com.atguigu.factory.absfactory.pizzastore.pizza.BJPepperPizza; import com.atguigu.factory.absfactory.pizzastore.pizza.Pizza; //這是工廠子類 public class BJFactory implements AbsFactory { @Override public Pizza createPizza(String orderType) { System.out.println("~使用的是抽象工廠模式~"); // TODO Auto-generated method stub Pizza pizza = null; if(orderType.equals("cheese")) { pizza = new BJCheesePizza(); } else if (orderType.equals("pepper")){ pizza = new BJPepperPizza(); } return pizza; } }
工廠子類:(倫敦的)
import com.atguigu.factory.absfactory.pizzastore.pizza.LDCheesePizza; import com.atguigu.factory.absfactory.pizzastore.pizza.LDPepperPizza; import com.atguigu.factory.absfactory.pizzastore.pizza.Pizza; public class LDFactory implements AbsFactory { @Override public Pizza createPizza(String orderType) { System.out.println("~使用的是抽象工廠模式~"); Pizza pizza = null; if (orderType.equals("cheese")) { pizza = new LDCheesePizza(); } else if (orderType.equals("pepper")) { pizza = new LDPepperPizza(); } return pizza; } }
訂購:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import com.atguigu.factory.absfactory.pizzastore.pizza.Pizza; public class OrderPizza { AbsFactory factory; // 構造器 public OrderPizza(AbsFactory factory) { setFactory(factory); } private void setFactory(AbsFactory factory) { Pizza pizza = null; String orderType = ""; // 使用者輸入 this.factory = factory; do { orderType = getType(); // factory 可能是北京的工廠子類,也可能是倫敦的工廠子類 pizza = factory.createPizza(orderType); if (pizza != null) { // 訂購ok pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); } else { System.out.println("訂購失敗"); break; } } while (true); } // 寫一個方法,可以獲取客戶希望訂購的披薩種類 private String getType() { try { BufferedReader strin = new BufferedReader(new InputStreamReader(System.in)); System.out.println("input pizza 種類:"); String str = strin.readLine(); return str; } catch (IOException e) { e.printStackTrace(); return ""; } } }
測試:呼叫對應的北京或倫敦的工廠
public class PizzaStore { public static void main(String[] args) { // TODO Auto-generated method stub //new OrderPizza(new BJFactory()); new OrderPizza(new LDFactory()); } }工廠模式在JDK-Calendar 應用的原始碼分析 JDK 中的Calendar類中,就使用了簡單工廠模式
import java.util.Calendar; public class Factory { public static void main(String[] args) { // TODO Auto-generated method stub // getInstance 是 Calendar 靜態方法,通過類名呼叫的 Calendar cal = Calendar.getInstance(); // 注意月份下標從0開始,所以取月份要+1 System.out.println("年:" + cal.get(Calendar.YEAR)); System.out.println("月:" + (cal.get(Calendar.MONTH) + 1)); System.out.println("日:" + cal.get(Calendar.DAY_OF_MONTH)); System.out.println("時:" + cal.get(Calendar.HOUR_OF_DAY)); System.out.println("分:" + cal.get(Calendar.MINUTE)); System.out.println("秒:" + cal.get(Calendar.SECOND)); } }
找到getInstance 方法,在jdk原始碼的Calendar類的1611行:
這了呼叫了createCalendar 方法,根據你的時區和地區返回一個例項,找到這個方法:1658行
得到一個provider,然後判斷是否為空,不為空呼叫provider的getInstance方法,返回的是Calendar
工廠模式小結 1) 工廠模式的意義 將例項化物件的程式碼提取出來,放到一個類中統一管理和維護,達到和主專案的依賴關係的解耦。從而提高專案的擴充套件和維護性。 2)三種工廠模式 (簡單工廠模式、工廠方法模式、抽象工廠模式) 3) 設計模式的依賴抽象原則- 建立物件例項時,不要直接 new 類, 而是把這個new 類的動作放在一個工廠的方法中,並返回。有的書上說,變數不要直接持有具體類的引用。
- 不要讓類繼承具體類,而是繼承抽象類或者是實現interface(介面)
- 不要覆蓋基類中已經實現的方法。