工廠模式 學習 工廠模式

工廠模式

簡單工廠模式(Simple Factory Pattern)是指由一個工廠對象決定創建出哪一種產品類的實例。

屬於創建型模式,但它不屬於GOF,23種設計模式。

試用場景:

工廠類負責創建的對象較少。
客戶端只需要傳入工廠類的參數,對於如何創建對象的邏輯不需要關心。

優點:

只需傳入一個正確的參數,就可以獲取你所需要的對象無須知道其創建的細節。

缺點:

工廠類的職責相對過重,增加新的產品時需要修改工廠類的判斷邏輯,違背開閉原則。
不易於擴展過於複雜的產品結構。

public interface ICourse {
    /**
     * 錄製視頻
     * @return
     */
    void record();
}
public class PythonCourse implements ICourse {
    @Override
    public void record() {
        System.out.println("錄製Python課程");
    }
}
public class JavaCourse implements ICourse {
    @Override
    public void record() {
        System.out.println("錄製Java課程");
    }
}

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 class SimpleFactoryTest {
    public static void main(String[] args) {
        CourseFactory factory = new CourseFactory();
        ICourse course = factory.create(JavaCourse.class);
        course.record();

        ICourse course1 = factory.create(PythonCourse.class);
        course1.record();
    }
}

工廠方法模式(Fatory Method Pattern)是指定義一個創建對象的接口,但讓實現這個接口的類來決定實例化哪個類,工廠方法讓類的實例化推遲到子類中進行。

屬於創建型設計模式。

適用場景:

創建對象需要大量重複的代碼。
客戶端(應用層)不依賴於產品類實例如何被創建、實現等細節。
一個類通過其子類來指定創建哪個對象。

優點:

用戶只需關心所需產品對應的工廠,無須關心創建細節。
加入新產品符合開閉原則,提高了系統的可擴展性。

缺點:

類的個數容易過多,增加了代碼結構的複雜度。
增加了系統的抽象性和理解難度。

public interface ICourseFactory {
    ICourse create();
}
public class JavaCourseFactory implements ICourseFactory {
    @Override
    public ICourse create() {
        return new JavaCourse();
    }
}
public class PythonCourseFactory implements ICourseFactory {
    @Override
    public ICourse create() {
        return new PythonCourse();
    }
}
public class FactoryMethodTest {
    public static void main(String[] args) {
        ICourseFactory factory = new PythonCourseFactory();
        ICourse course = factory.create();
        course.record();

        factory = new JavaCourseFactory();
        course = factory.create();
        course.record();
    }
}

抽象工廠模式(Abastract Factory Pattern)是指提供一個創建一系列相關或相互依賴對象的接口,無須指定他們具體的類。

屬於創建型設計模式。

適用場景:

客戶端(應用層)不依賴於產品類實例如何被創建、實現等細節。
強調一系列相關的產品對象(屬於同一產品族)一起使用創建對象需要大量重複的代碼。
提供一個產品類的庫,所有的產品以同樣的接口出現,從而使客戶端不依賴於具體實現。

優點:

具體產品在應用層代碼隔離,無須關心創建細節
將一個系列的產品族統一到一起創建。

缺點:

規定了所有可能被創建的產品集合,產品族中擴展新的產品困難,需要修改抽象工廠的接口。
增加了系統的抽象性和理解難度。

/**
 * 抽象工廠是用戶的主入口
 * 在Spring中應用得最爲廣泛的一種設計模式
 * 易於擴展
 */
public interface CourseFactory {
    INote createNote();
    IVideo createVideo();
}
/**
 * 課堂筆記
 */
public interface INote {
    void edit();
}
/**
 * 錄播視頻
 */
public interface IVideo {
    void record();
}
public class JavaCourseFactory implements CourseFactory {
    @Override
    public INote createNote() {
        return new JavaNote();
    }
    @Override
    public IVideo createVideo() {
        return new JavaVideo();
    }
}
/**
 * Java筆記
 */
public class JavaNote implements INote {
    @Override
    public void edit() {
        System.out.println("編寫Java筆記");
    }
}
public class JavaVideo implements IVideo {
    @Override
    public void record() {
        System.out.println("錄製Java視頻");
    }
}
public class PythonCourseFactory implements CourseFactory {
    @Override
    public INote createNote() {
        return new PythonNote();
    }
    @Override
    public IVideo createVideo() {
        return new PythonVideo();
    }
}
/**
 * Python筆記
 */
public class PythonNote implements INote {

    @Override
    public void edit() {
        System.out.println("編寫Python筆記");
    }
}
public class PythonVideo implements IVideo {
    @Override
    public void record() {
        System.out.println("錄製Python視頻");
    }
}
public class AbstractFactoryTest {

    public static void main(String[] args) {
        JavaCourseFactory factory = new JavaCourseFactory();
        factory.createNote().edit();
        factory.createVideo().record();
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章