?? Creational Pattern是對類的實例化過程的抽象化。一些系統在創建對象時,需要動態的決定怎么樣創建對象,創建那些對象,以及如何組合和表示這些對象。Creational Pattern描述了怎么樣構造和封裝這些動態的決定。
??? Creational Pattern分為類的創建模式和對象的創建模式兩種。
??? 類的創建模式:???? 類的創建模式使用繼承關系,把類的創建延遲到子類,從而封裝了客戶端將得到的哪些具體類的信息,并且隱 藏了這 類的實例是如何被創建和放到一起的。
??? 對象的創建模式: 對象的創建模式是把對象的創建過程動態的委派給另一個對象,從而動態地決定客戶端將得到哪些具體的類的實例,以及這些類的實例是如何被創建和組合在一起的。
??? Simple Factory是類的創建模式,又稱為Static Factory Method模式,它是由一個工廠對象決定創造出哪一種產品類的實例。工廠模式負責將大量有共同接口的類實例化。工廠模式可以動態的決定哪一個類實例化,不必事先知道每次要實例化哪一個類。工廠模式有如下的幾種形態:
● Simple Factory 模式:又叫Static Factory Method.
● Factory Method模式:又稱多態工廠(Polymorphic Factory)模式。
● Abstract Factory模式:又稱工具箱(Kit或ToolKit)模式。
簡單工廠模式涉及到工廠角色,抽象產品角色以及具體產品角色等三個角色:
● 工廠類(Creator)角色:擔任這個角色的是工廠方法模式的核心,含有與應用緊密相關的商業邏輯。工廠類在客戶端的直接調用下創建產品對象,它往往由一個具體的java類實現。
● 抽象產品(Product)角色:擔任這個角色的是由工廠方法模式所創建的對象的父類,或它們共同擁有的接口。抽象產品可以由一個Java接口或Java抽象類實現。
● 具體產品(Concrete Product)角色:工廠模式所創建的任何對象都是這個角色的實例,具體產品角色由一個具體的Java類實現。
demo:
?以農場為例子,農場公司專門向市場銷售水果。農場得有專門的園丁來管理水果。
interface Fruti
{
?//水果的接口
?/**
?* 生長
?*/
?void grow();?
?
?/**
?* 收獲
?*/
?void harvest();
?
?/**
?* 種植
?*/
?void plant();
}
具體的水果:蘋果,葡萄,草莓
Apple.java:
class Apple implements Fruit
{
?private int treeAge;?? //蘋果的樹齡
?
?/**
?* 生長
?*/
?public void grow()
?{
??log("Apple is growing......");
?}
?
?/**
?* 收獲
?*/
?pubic void harvest()
?{
??log("Apple has been harvested.");
?}
?
?/**
?* 種植
?*/
?public void plant()
?{
??log("Apple has been planted");
?}
?
?/**
?* 輔助方法
?*/
?public static void log(String str)
?{
??System.out.println(str);
?}
?
?/**
?* 樹齡的取值方法
?*/
?public int getTreeAge()
?{
??return this.treeAge;
?}
?
?/**
?* 樹齡的賦值方法
?*/
?public void setTreeAge(int treeAge)
?{
??this.treeAge = treeAge;
?}
}
Grape.java
class Grape implements Fruit
{
?private boolean seedless;? //葡萄的籽
?
?/**
?* 生長
?*/
?public void grow()
?{
??log("Grape is growing.....");
?}
?
?/**
?* 收獲
?*/
?public void harvest()
?{
??log("Grape has been harveted");
?}
?
?/**
?* 種植
?*/
?public void plant()
?{
??log("Grape has been planted");
?}
?
?/**
?* 輔助方法
?*/
?public static void log(String msg)
?{
??System.out.println(msg);
?}
?
?/**
?* 有無籽的取值方法
?*/
?public boolean getSeedless()
?{
??return this.seedless;
?}
?
?/**
?* 有無籽的賦值方法
?*/
?public void setSeedless(boolean seedless)
?{
??this.seedless = seedless;
?}
}
Strawberry.java
class Strawberry implements Fruit
{
?/**
?* 生長
?*/
?public void grow()
?{
??log("Strawberry is growing.....");
?}
?
?/**
?* 收獲
?*/
?public void harvest()
?{
??log("Strawberry has been harvested");
?}
?
?/**
?* 種植
?*/
?public void plant()
?{
??log("Strawberry has been planted");
?}
?
?/**
?* 輔助方法
?*/
?public static void log(String msg)
?{
??System.out.println(msg);
?}
}
具體的園丁:
public class FruitGradener
{
?/**
?* 靜態工廠方法
?*/
?public static Fruti factory(String witch)throws BadFruitException
?{
??if(witch.equalsIgnoreCase("apple"))
??{
???return new Apple();
??}
??else if(withc.equalsIgnoreCase("Grape"))
??{
???return new Grape();
??}
??else if(witch.equalsIgnoreCase("Strawberry"))
??{
???return new Strawberry();
??}
??else
??{
???thow new BasFruitException("Bad fruit request");
??}
?}
}
抽象產品角色的主要目的就是給所有的具體產品提供一個共同的類型,在最簡單的情況下可以簡化為一個標識接口。如:
public interface Product
{
}
工廠類角色就是創建一個新的具體產品實例返回給調用者。如:
public class? Creator
{
?? /**
?? * 靜態工廠方法
?? */
??? return new ConreteProduct();
}
具體的產品就是實際的對象了,如:
public class ConreteProduct implemnts Product
{
??? public ConcreteProduct(){}
}
如果模式所產生的具體產品類彼此之間沒有共同的商業邏輯,那么抽象產品可以由一個JAVA接口扮演,如果有共同的商務邏輯則應當使用抽象角色扮演。這樣共同的邏輯都放到抽象類里去了,達到共享的目的。