<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                <!-- Factories: Encapsulating Object Creation --> ## 工廠模式 當你發現必須將新類型添加到系統中時,合理的第一步是使用多態性為這些新類型創建一個通用接口。這會將你系統中的其余代碼與要添加的特定類型的信息分開,使得可以在不改變現有代碼的情況下添加新類型……或者看起來如此。起初,在這種設計中,似乎你必須更改代碼的唯一地方就是你繼承新類型的地方,但這并不是完全正確的。 你仍然必須創建新類型的對象,并且在創建時必須指定要使用的確切構造器。因此,如果創建對象的代碼分布在整個應用程序中,那么在添加新類型時,你將遇到相同的問題——你仍然必須追查你代碼中新類型礙事的所有地方。恰好是類型的創建礙事,而不是類型的使用(通過多態處理),但是效果是一樣的:添加新類型可能會引起問題。 解決方案是強制對象的創建都通過通用工廠進行,而不是允許創建代碼在整個系統中傳播。 如果你程序中的所有代碼都必須執行通過該工廠創建你的一個對象,那么在添加新類時只需要修改工廠即可。 由于每個面向對象的程序都會創建對象,并且很可能會通過添加新類型來擴展程序,因此工廠是最通用的設計模式之一。 舉例來說,讓我們重新看一下**Shape**系統。 首先,我們需要一個用于所有示例的基本框架。 如果無法創建**Shape**對象,則需要拋出一個合適的異常: ```java // patterns/shapes/BadShapeCreation.java package patterns.shapes; public class BadShapeCreation extends RuntimeException { public BadShapeCreation(String msg) { super(msg); } } ``` 接下來,是一個**Shape**基類: ```java // patterns/shapes/Shape.java package patterns.shapes; public class Shape { private static int counter = 0; private int id = counter++; @Override public String toString(){ return getClass().getSimpleName() + "[" + id + "]"; } public void draw() { System.out.println(this + " draw"); } public void erase() { System.out.println(this + " erase"); } } ``` 該類自動為每一個**Shape**對象創建一個唯一的`id`。 `toString()`使用運行期信息來發現特定的**Shape**子類的名字。 現在我們能很快創建一些**Shape**子類了: ```java // patterns/shapes/Circle.java package patterns.shapes; public class Circle extends Shape {} ``` ```java // patterns/shapes/Square.java package patterns.shapes; public class Square extends Shape {} ``` ```java // patterns/shapes/Triangle.java package patterns.shapes; public class Triangle extends Shape {} ``` 工廠是具有能夠創建對象的方法的類。 我們有幾個示例版本,因此我們將定義一個接口: ```java // patterns/shapes/FactoryMethod.java package patterns.shapes; public interface FactoryMethod { Shape create(String type); } ``` `create()`接收一個參數,這個參數使其決定要創建哪一種**Shape**對象,這里是`String`,但是它其實可以是任何數據集合。對象的初始化數據(這里是字符串)可能來自系統外部。 這個例子將測試工廠: ```java // patterns/shapes/FactoryTest.java package patterns.shapes; import java.util.stream.*; public class FactoryTest { public static void test(FactoryMethod factory) { Stream.of("Circle", "Square", "Triangle", "Square", "Circle", "Circle", "Triangle") .map(factory::create) .peek(Shape::draw) .peek(Shape::erase) .count(); // Terminal operation } } ``` 在主函數`main()`里,要記住除非你在最后使用了一個終結操作,否則**Stream**不會做任何事情。在這里,`count()`的值被丟棄了。 創建工廠的一種方法是顯式創建每種類型: ```java // patterns/ShapeFactory1.java // A simple static factory method import java.util.*; import java.util.stream.*; import patterns.shapes.*; public class ShapeFactory1 implements FactoryMethod { public Shape create(String type) { switch(type) { case "Circle": return new Circle(); case "Square": return new Square(); case "Triangle": return new Triangle(); default: throw new BadShapeCreation(type); } } public static void main(String[] args) { FactoryTest.test(new ShapeFactory1()); } } ``` 輸出結果: ```java Circle[0] draw Circle[0] erase Square[1] draw Square[1] erase Triangle[2] draw Triangle[2] erase Square[3] draw Square[3] erase Circle[4] draw Circle[4] erase Circle[5] draw Circle[5] erase Triangle[6] draw Triangle[6] erase ``` `create()`現在是添加新類型的Shape時系統中唯一需要更改的其他代碼。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看