JavaScript動畫例項:動感小球
阿新 • • 發佈:2020-07-13
簡單工廠模式
定義了一個建立物件的類,由這個類來封裝例項化物件的行 為(程式碼)
相當於一個靜態類,專門用於例項化物件
public class SimpleFactory { /** * 工廠方法 用此方法例項化物件 * @param name * @return */ public static Product creatProduct(String name) { if (name.equals("小米")) { return new Xiaomi(); } else if (name.equals("華為")) { return new HuaWei(); } else { return null; } } public static void main(String[] args) { SimpleFactory.creatProduct("小米"); SimpleFactory.creatProduct("華為"); } } /** * 定義一個產品抽象類 * 所有的商品都繼承此類 */ abstract class Product { } class Xiaomi extends Product { public Xiaomi() { System.out.println("生產小米手機"); } } class HuaWei extends Product { public HuaWei() { System.out.println("生產華為手機"); } }
簡單工廠模式 有新增產品需要修改工廠類,並且只能建立一類商品。
工廠模式
使用簡單工廠模式時,工廠必須知道產品的所有實現細節,當新增產品時需要修改工廠類的邏輯程式碼,這違反開閉原則,對於一個成熟的類應該儘量做到不修改,可拓展。因此工廠模式可以很好的解決此問題。
工廠模式的工廠不再是一個具體的類而是一個介面在這裡面規定的工廠的實現方法,工廠不在需要知道產品的具體實現細節,而是由介面的具體實現類去實現。子類工廠只需要實現工廠抽象,而之後如果有新增產品類,只需要實現抽象介面。
/** * 工廠抽象介面 */ public interface ProductFactory { Product creatFactory(); } /** * 工廠實現類1 */ class XiaomiFactory implements ProductFactory { @Override public Product creatFactory() { return new Xiaomi(); } } /** * 工廠實現類2 */ class HuaweiFactory implements ProductFactory { @Override public Product creatFactory() { return new Huawei(); } } abstract class Product { } class Xiaomi extends Product { public Xiaomi() { System.out.println("生產小米手機"); } } class Huawei extends Product { public Huawei() { System.out.println("生產華為手機"); } }
抽象工廠類
對於工廠類,只能生產某一類商品。比如手機就只能生產手機,不能生產汽車。抽象工廠類可以生產多種型別的產品。抽象工廠類與工廠類的區別也很簡單,即使可以生產多品類的商品,要實現生產其他品類的產品,只需要在抽象類中加入實現的規則即可。
/**
* 工廠抽象介面
*/
public interface ProductFactory {
Product1 creatFactory1();
Product2 creatFactory2();
}
可以看到要新增其他品類的方法需要修改工廠方法,這又違背開閉原則。具體使用哪一種模式要根據實際情況而定,沒有完全的好與壞之分。