1、前言java
前面咱們說過模板方法被用在了工廠方法裏面,爲何呢?工廠是製造產品的,須要按照必定的流程去創造產品,所以這必定的流程創造產品就是咱們的模板了。工廠方法能夠說用的不少,在咱們的第一個設計模式,迭代器裏面,咱們其實就用到過,只不過咱們不知道而已,下面咱們先看一下工廠方法的本質,而後再逐一分析。設計模式
2、代碼ide
package designMode.factory; public abstract class Factory { public abstract Product createProduct(String owner); public abstract void registerProduct(Product p); public abstract void getAllProductOwner(); public Product create(String owner){ Product p = createProduct(owner); registerProduct(p); return p; } }
package designMode.factory; import java.util.ArrayList; import java.util.List; public class IDCardFactory extends Factory { List owners = new ArrayList(); public Product createProduct(String owner){ System.out.println("爲 "+owner+" 創造產品成功..."); return new IDCardProduct(owner); } @Override public void registerProduct(Product p) { String owner=((IDCardProduct)p).getOwner(); owners.add(owner); System.out.println("註冊 "+owner+" 的產品成功..."); } @Override public void getAllProductOwner() { for(int i=0;i<owners.size();i++){ System.out.println("產品用戶:"+owners.get(i)); } } }
package designMode.factory; public abstract class Product { public abstract void use(); }
package designMode.factory; public class IDCardProduct extends Product { String owner; public IDCardProduct(String owner) { this.owner = owner; } @Override public void use() { System.out.println("用戶 "+owner+" 正在使用產品..."); } public String getOwner() { return owner; } }
package designMode.factory; public class FactoryMain { public static void main(String[] args) { Factory f = new IDCardFactory(); Product p=f.create("江疏影"); p.use(); System.out.println("--------------------"); p=f.create("邱淑貞"); p.use(); System.out.println("--------------------"); f.getAllProductOwner(); } }
至此咱們能夠看到在工廠抽象類裏面定義了創造產品和註冊產品,而後在實現類裏面真的進行創造和註冊產品。函數
對於抽象類,必須有構造函數,由於子類的初始化須要先調用抽象類的構造函數,而後是子類的構造函數;可是抽象類的構造函數不能定義成抽象的,由於若是這樣的話,將不能被實現,所以沒有抽象的構造函數。學習
3、總結this
工廠模式使用了繼承、接口、抽象等機制,和以前寫的迭代器模式、模板模式都是同樣的,能夠看出設計模式並非獨立的,而是相互之間有關係和區別的,在學習的時候咱們要善於總結設計模式之間的共同之處和不一樣之處,活學活用,才能在之後的大型項目中選擇正確的開發方式,事半功倍。spa
淺談設計模式<最通俗易懂的講解>.net