A041Java設計模式-工廠模式

一、概述

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();
    }
}

運行結果:

學生喫飯了!
學生睡覺了!
老師喫飯了!
老師睡覺了!

 

 

 

 

 

 

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