一.簡單工廠模式
基本概念:由一個工廠對象決定創建哪一種產品類的實例。簡單工廠模式它不屬於23種設計模式。
試用場景:適用於工廠類負責創建的對象較少的場景,且客戶端只需傳入工廠類的參數,對於如何創建對象不需要關心。
缺點:隨着產品鏈的豐富,如果每個課程的創建邏輯有區別,則工廠的職責會變得越來越多,職責相對過重,不易於擴展過於複雜的產品結構。
案例:Calendar
代碼實例:
/*創建課程接口*/
public interface ICourse {
void record();
}
/*我是一個java課實例*/
public class JavaCourse implements ICourse {
public void record() {
System.out.println("Java課程");
}
}
/*我是一個python課實例*/
public class PythonCourse implements ICourse {
public void record() {
System.out.println("Python課程");
}
}
/*創建一個課程類工廠,傳入需要創建的課程類,返回課程類實體*/
public class CourseFactory {
public ICourse create(Class<? extends ICourse> clazz){
try {
if (null != clazz) {
return clazz.newInstance();
}
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}
/*調用*/
public static void main(String[] args) {
CourseFactory factory = new CourseFactory();
ICourse course = factory.create(JavaCourse.class);
course.record();
}
注:newInstance()也是用來創建新的對象,其與new()的區別是:newInstance():弱類型,效率低,只能調用無參構造new():強類型,高效率,能調用任何public構造器
二.工廠模式
基本概念:定義一個創建對象的接口,讓實現這個接口的類決定實例化那個類,工廠方法模式讓類的實例化推遲到子類中進行。在工廠方法模式中用戶只需要關心所需產品對應的工廠,無需關心創建細節,並且加入新的產品時符合開閉原則。
特點:工廠模式不同於簡單工廠,將職能拆分,專人幹專事。Java課程由Java工廠創建,Python課程由python工廠創建,對工廠本身也做一個抽象。
試用場景:創建對象需要大量重複的代碼;客戶端(應用層)不依賴於產品類實例如何被創建等細節;一個類通過其子類來指定創建那個類。
缺點:類的個數容易過多,增加複雜度;增加了系統的抽象性和理解難度
/*抽象課程工廠類*/
public interface ICourseFactory {
ICourse create();
}
/*Java課程工廠類*/
public class JavaCourseFactory implements ICourseFactory {
public ICourse create() {
return new JavaCourse();
}
}
/*Python課程工廠類*/
public class PythonCourseFactory implements ICourseFactory {
public ICourse create() {
return new PythonCourse();
}
}
/*調用測試*/
public class FactoryMethodTest {
public static void main(String[] args) {
/*java的調用java的*/
ICourseFactory factory = new PythonCourseFactory();
ICourse course = factory.create();
course.record();
}
}
案例:logback