國慶期間去東北參加了朋友的婚禮,時光飛逝呀,人生漫長又短暫,要給自己找點有樂趣的事情去做。
以下實踐來自實驗樓,鏈接:https://www.shiyanlou.com/courses/100/learning/?id=865,
什麼是工廠模式?
工廠一般指生產特定產品的平臺,那麼類似的,工廠模式可以將其類比爲一個工廠,指生產特定類型的對象的一種模式。工廠模式封裝了創建對象的細節,使用者只使用對象就可以。
工廠模式分類:
普通工廠模式、多個工廠模式、靜態工廠方法模式
普通工廠模式示例:
實現代碼:
// 二者共同的接口
interface Human{
public void eat();
public void sleep();
public void beat();
}
// 創建實現類 Male
class Male implements Human{
public void eat(){
System.out.println("Male can eat.");
}
public void sleep(){
System.out.println("Male can sleep.");
}
public void beat(){
System.out.println("Male can beat.");
}
}
//創建實現類 Female
class Female implements Human{
public void eat(){
System.out.println("Female can eat.");
}
public void sleep(){
System.out.println("Female can sleep.");
}
public void beat(){
System.out.println("Female can beat.");
}
}
// 創建普通工廠類
class HumanFactory{
public Human createHuman(String gender){
if( gender.equals("male") ){
return new Male();
}else if( gender.equals("female")){
return new Female();
}else {
System.out.println("請輸入正確的類型!");
return null;
}
}
}
// 工廠測試類
public class FactoryTest {
public static void main(String[] args){
HumanFactory factory = new HumanFactory();
Human male = factory.createHuman("male");
male.eat();
male.sleep();
male.beat();
}
}
編譯後運行即可。
多個工廠模式示例:
// 多個工廠方法
public class HumanFactory{
public Male createMale() {
return new Male();
}
public Female createFemale() {
return new Female();
}
}
// 工廠測試類
public class FactoryTest {
public static void main(String[] args){
HumanFactory factory = new HumanFactory();
Human male = factory.createMale();
male.eat();
male.sleep();
male.beat();
}
}
靜態工廠方法模式示例:
// 多個工廠方法
public class HumanFactory{
public static Male createMale() {
return new Male();
}
public static Female createFemale() {
return new Female();
}
}
// 工廠測試類
public class FactoryTest {
public static void main(String[] args){
Human male = HumanFactory.createMale();
male.eat();
male.sleep();
male.beat();
}
}
如上,可以看到,工廠模式只有一個創建函數,多個工廠模式有多個創建函數,靜態工廠模式將多個工廠模式的創建函數設置爲靜態。第一種在使用時需要記住傳入的字符,第二種需要實例化對象,因此使用最多的是第三種方法。
應用舉例:
java中應用舉例:
java.util.Calendar - getInstance()
java.util.Calendar - getInstance(TimeZone zone)
java.util.Calendar - getInstance(Locale aLocale)
java.util.Calendar - getInstance(TimeZone zone, Locale aLocale)
java.text.NumberFormat - getInstance()
java.text.NumberFormat - getInstance(Locale inLocale)