標籤:rri 理解 err str 抽象 new 流程 加工 使用
第四章: 原廠模式
原廠模式所包含的角色:
1.Product(產品)
2.Creator(建立者)
3.ConcreateProduct(具體的產品)
4.ConcreateCreator(具體的建立者)
實現流程: 定義抽象產品(Product),在抽象產品(Product)中可以定義需要實現的抽象方法,原廠模式在使用中一般都是以多態形式使用,如:
Factory f = new XXXFactory("XXX");f.xxx();
其中f.xxx();就是你在產品(Product)類中定義的方法,可以理解為你的產品造出來後,怎麼去使用,那麼就在這裡定義。
接著還需要抽象工廠,這裡用到了模板模式(Template),在抽象工廠類中都會有Create();這個方法,在這個方法中可以放入需要的參數,可以理解為在加工產品是需要用到的‘原料’!
如果用到原廠模式,那麼在一般情況下都是有較為複雜邏輯,在Create()這個方法中就可以去進行產品的建立以及‘加工‘。
具體產品類是必須的,繼承抽象產品(Product),其中關係就比如聯想Thinkpad繼承電腦這樣,電腦有開機方法,那麼Thinkpad去繼承它。
具體工廠,抽象工廠只定義抽象方法,是具體工廠的父類,在具體工廠中再去進行new對象,完成在抽象工廠中定義的一系列流程。
Code:
抽象工廠:
package example.factory.method;/** * 用於產生Product類,並對Product進行"加工" * @author Administrator * */public abstract class Factory {public final Product create(String owner) {Product p = createProduct(owner);registerProduct(p);return p;}protected abstract void registerProduct(Product p);protected abstract Product createProduct(String owner);}
抽象產品:
package example.factory.method;/*** * 只定義抽閑方法的抽象類別,use * @author Administrator * */public abstract class Product {public abstract void use ();}
具體產品:
package example.factory.method;/** * 產品,繼承Product類的use使用功能。 * @author Administrator * */public class IDCard extends Product{private String owner;@Overridepublic void use() {System.out.println("使用了" + owner + "的ID卡");}IDCard(String owner){System.out.println("製作" + owner + "的ID卡");this.owner = owner;}public String getOwner() {return owner;}}
具體工廠:
package example.factory.method;import java.util.ArrayList;import java.util.List;public class IdCardFactory extends Factory{private List<String> owners = new ArrayList<>();@Overrideprotected void registerProduct(Product p) {owners.add(((IDCard)p).getOwner());}@Overrideprotected Product createProduct(String owner) {return new IDCard(owner);}}
package example.factory.method;public class Main {public static void main(String[] args) {Factory factory = new IdCardFactory();Product card1 = factory.create("測試");card1.use();}}
Factory Method模式