設計模式:工廠方法
設計模式:工廠方法
一、前言
前面我們說過模板方法被用在了工廠方法裏面,為什麽呢?工廠是制造產品的,需要按照一定的流程去創造產品,因此這一定的流程創造產品就是我們的模板了。工廠方法可以說用的很多,在我們的第一個設計模式,叠代器裏面,我們其實就用到過,只不過我們不知道而已,下面我們先看一下工廠方法的本質,然後再逐一分析。
二、代碼
我們直接看代碼,然後就有一定的理解了。
Factory代碼:
1 package zyr.dp.factory; 2 3 public abstract class Factory { 4 public abstract Product createProduct(String owner);5 public abstract void registerProduct(Product p); 6 public abstract void getAllProductOwner(); 7 public Product create(String owner){ 8 Product p=createProduct(owner); 9 registerProduct(p); 10 return p; 11 } 12 }
IDCardFactory 實現類:
1 package zyr.dp.factory; 2 3 importjava.util.ArrayList; 4 import java.util.List; 5 6 public class IDCardFactory extends Factory { 7 List owners=new ArrayList(); 8 public Product createProduct(String owner) { 9 System.out.println("為 "+owner+" 創造產品成功..."); 10 return new IDCardProduct(owner); 11 } 12 13public void registerProduct(Product p) { 14 String owner=((IDCardProduct)p).getOwner(); 15 owners.add(owner); 16 System.out.println("註冊 "+owner+" 的產品成功..."); 17 } 18 19 public void getAllProductOwner() { 20 for(int i=0;i<owners.size();i++){ 21 System.out.println("產品用戶:"+owners.get(i)); 22 } 23 } 24 }
Product方法:
1 package zyr.dp.factory; 2 3 public abstract class Product { 4 public abstract void use(); 5 }
IDCardProduct 方法:
1 package zyr.dp.factory; 2 3 public class IDCardProduct extends Product { 4 5 String owner; 6 IDCardProduct(String owner){ 7 this.owner=owner; 8 } 9 public void use() { 10 System.out.println("用戶 "+owner+" 正在使用產品..."); 11 } 12 public String getOwner() { 13 return owner; 14 } 15 }
Main類:
1 package zyr.dp.factory; 2 3 public class Main { 4 5 public static void main(String[] args) { 6 Factory f=new IDCardFactory(); 7 Product p=f.create("朱彥榮"); 8 p.use(); 9 System.out.println("--------------------"); 10 p=f.create("李山秀"); 11 p.use(); 12 System.out.println("--------------------"); 13 f.getAllProductOwner(); 14 } 15 16 }
運行結果:
至此我們可以看到在工廠抽象類裏面定義了創造產品和註冊產品,然後在實現類裏面真的進行創造和註冊產品,這裏的創造產品,我們使用了:
1 public Product createProduct(String owner) { 2 System.out.println("為 "+owner+" 創造產品成功..."); 3 return new IDCardProduct(owner); 4 }
對於這一句我們是不是似曾相識呢,還記得在叠代器裏面我們在集合類的實現類裏面也用到了這一句,將叠代器地實現類的對象返回給了叠代器的接口類型,並且在集合類的接口裏面我們定義了這樣的方法;在工廠類裏面,我們使用了相同的模式來操作,因此叠代器間接地使用了工廠方法來創造叠代器對象。在這裏我們思考可不可以將工廠類和產品類這兩個抽象類改成接口,答案是不能,因為我們使用了模板,模板的定義就要求我們能在父類中定義實際的概括性的操作(模板方法),而接口只能定義協議,不能定義實現;第二個問題,在工廠類裏面我們可不可以直接創造產品,答案是不能,因為如果在工廠類的創造產品方法中我們使用new Product();來做的話,Product就不能為抽象類了,因為抽象類不能new出對象。對於產品類的實現的構造方法裏面我們可以看到使用了默認的定義域,這樣只能在本包中使用該方法,保證了使用權限安全。
三、總結
到這裏我們一共學習了四種模式,叠代器、適配器、模板方法、工廠方法,其中叠代器使用了工廠方法,工廠方法使用了模板方法,都是用了繼承、接口、抽象等機制,適配器也有兩種適配方式。因此我們可以看到設計模式不是獨立的,而是相互之間有著關系和區別的,在學習的時候我們要善於總結設計模式之間的共同之處和不同之處,活學活用,才能在以後的大型項目開發中選擇正確的開發方式,事半功倍。
程序代碼
設計模式:工廠方法