一、概述
1、分類
工廠方法模式、抽象工廠模式;
二、工廠方法模式
1、分類
工廠方法模式分爲三種:
①普通工廠模式:
就是建立一個工廠類,對實現了同一接口的一些類進行實例的創建;
②多個工廠方法模式:
是對普通工廠方法模式的改進,在普通工廠方法模式中,如果傳遞的字符串出錯,則不能正確創建對象,而多個工廠方法模式是提供多個工廠方法,分別創建對象;
③靜態工廠方法模式:
將上面的多個工廠方法模式裏的方法置爲靜態的,不需要創建實例,直接調用即可;
2、普通工廠模式
簡介:
建立一個工廠類,對實現了同一接口的一些類進行實例的創建;
代碼示例:
公共接口Person:
package com.zibo.design_mode.factory;
public interface Person {
void eat();
void sleep();
}
學生類:
package com.zibo.design_mode.factory;
public class Student implements Person {
@Override
public void eat() {
System.out.println("學生喫飯了!");
}
@Override
public void sleep() {
System.out.println("學生睡覺了!");
}
}
老師類:
package com.zibo.design_mode.factory;
public class Teacher implements Person {
@Override
public void eat() {
System.out.println("老師喫飯了!");
}
@Override
public void sleep() {
System.out.println("老師睡覺了!");
}
}
工廠模式測試類:
package com.zibo.design_mode.factory;
public class FactoryPattern {
public static void main(String[] args) {
Person p1 = create("學生");
p1.eat();
p1.sleep();
Person p2 = create("老師");
p2.eat();
p2.sleep();
}
//工廠方法
public static Person create(String string){
if("學生".equals(string)){
return new Student();
}else if("老師".equals(string)){
return new Teacher();
}else {
throw new RuntimeException("請輸入正確的參數!");
}
}
}
運行結果:
學生喫飯了!
學生睡覺了!
老師喫飯了!
老師睡覺了!
3、多個工廠方法模式
簡介:
該模式是對普通工廠方法模式的改進,在普通工廠方法模式中,如果傳遞的字符串出錯,則不能正確創建對象,而多個工廠方法模式是提供多個工廠方法,分別創建對象;
代碼示例:
PersonFactory類:
package com.zibo.design_mode.factory;
public class PersonFactory {
public Person createStudent(){
return new Student();
}
public Person createTeacher(){
return new Teacher();
}
}
PersonFactoryTest測試類:
package com.zibo.design_mode.factory;
public class PersonFactoryTest {
public static void main(String[] args) {
PersonFactory factory = new PersonFactory();
Person p1 = factory.createStudent();
p1.eat();
p1.sleep();
Person p2 = factory.createTeacher();
p2.eat();
p2.sleep();
}
}
運行結果:
學生喫飯了!
學生睡覺了!
老師喫飯了!
老師睡覺了!
4、靜態工廠方法模式
簡介:
將上面的多個工廠方法模式裏的方法置爲靜態的,不需要創建實例,直接調用即可;
代碼示例:
PersonStaticFactory類:
package com.zibo.design_mode.factory;
public class PersonStaticFactory {
public static Person createStudent(){
return new Student();
}
public static Person createTeacher(){
return new Teacher();
}
}
PersonStaticFactoryTest測試類:
package com.zibo.design_mode.factory;
public class PersonStaticFactoryTest {
public static void main(String[] args) {
Person p1 = PersonStaticFactory.createStudent();
p1.eat();
p1.sleep();
Person p2 = PersonStaticFactory.createTeacher();
p2.eat();
p2.sleep();
}
}
運行結果:
學生喫飯了!
學生睡覺了!
老師喫飯了!
老師睡覺了!
三、抽象工廠模式
1、簡介
工廠方法模式有一個問題就是,類的創建依賴工廠類,也就是說,如果想要擴展程序,必須對工廠類進行修改,這違背了閉包原則,所以,從設計角度考慮,有一定的問題,如何解決?
那麼這就用到了抽象工廠模式,創建多個工廠類,這樣一旦需要增加新的功能,直接增加新的工廠類就可以了,不需要修改之前的代碼;
2、代碼示例
總工廠接口Factory:
package com.zibo.design_mode.factory;
public interface Factory {
Person create();
}
學生工廠類:
package com.zibo.design_mode.factory;
public class StudentFactory implements Factory {
@Override
public Person create() {
return new Student();
}
}
老師工廠類:
package com.zibo.design_mode.factory;
public class TeacherFactory implements Factory {
@Override
public Person create() {
return new Teacher();
}
}
工廠測試類:
package com.zibo.design_mode.factory;
public class FactoryTest {
public static void main(String[] args) {
Factory f1 = new StudentFactory();
Person p1 = f1.create();
p1.eat();
p1.sleep();
Factory f2 = new TeacherFactory();
Person p2 = f2.create();
p2.eat();
p2.sleep();
}
}
運行結果:
學生喫飯了!
學生睡覺了!
老師喫飯了!
老師睡覺了!