1. 程式人生 > >設計模式使用例項(1)——工廠模式與列舉類

設計模式使用例項(1)——工廠模式與列舉類

關於設計模式

設計模式是幹啥的?有啥用?

首先需要明白的是設計模式並不是新的語法,而是一種優雅的程式碼組織方式。

舉個最簡單的例子,我們為預設編碼utf-8定義一個常量,這樣我們的專案在指定編碼的時候都可以引用Constants.DEFAUL_CHARSET,如果更換編碼的時候我們不用一個個去找utf-8這個字串,而是直接更改Constants.DEFAUL_CHARSET的值就行了。

這其中就蘊含了一中程式碼組織的思想——避免重複——重複可能會帶來難以維護的問題。

public class Constants {
    public static final String DEFAULT_CHARSET="utf-8"
; }

在程式碼發展的悠久過程中,產生了很多使用的程式碼組織思想,其中有些異常經典的思想經過總結後,形成了常用的設計模式,通過了解設計模式,可以吸收一些好的方法,讓我們的程式碼更加合理、健壯、可維護、可拓展。

工廠模式1.0——極簡版本

工廠是幹嘛的地方,就是一個批量生產東西的地方。在我們的專案中如果有一些物件經常被需要,那麼我們不用自己製造,讓工廠去製造就OK了,比如針對學生類

public class Student {
    private String id;
    private String name;
    private String sex;
    private
String age; //省略get set方法 }

我們在測試中各處程式碼都需要一個隨機使用者,相當於每次都得自己製造一個Student物件

//常規寫法
        Student randStudent=new Student();
        randStudent.setId(UUID.randomUUID().toString());//通過UUID產生一個唯一id
        randStudent.setName("張三");
        randStudent.setAge("20");
        randStudent.setSex("男");

每個地方都寫這樣的程式碼,也就是說多次製造這個物件都得自己來,那不如讓工廠批量製造,所以可以用工廠模式:

/**
 * 學生工廠
 * @author easypanda
 * @date 2018-06-28
 */
public class StudentFactory {
    public static Student createRandStudent(){
        Student randStudent=new Student();
        randStudent.setId(UUID.randomUUID().toString());//通過UUID產生一個唯一id
        randStudent.setName("張三");
        randStudent.setAge("20");
        randStudent.setSex("男");
        return randStudent;
    }
}
Student randStudent=StudentFactory.createRandStudent();//每次使用從工廠生產即可

工廠模式2.0——拓寬產品種類

靠一種產品打天下是行不通的,比如小米手機,低中高配置都得有,比如海爾,電冰箱、洗衣機熱水器都有,這樣效率高。

同樣,工廠模式的工廠不能只生產一種物件,而是生產很多類似的物件。

/**
 * 抽象使用者介面
 * @author easypanda
 * @date 2018-06-28
 */
public interface User {

}
/**
 * 學生類
 * @author easypanda
 * @date 2018-06-28
 */
public class Student implements User{
    private String id;
    private String name;
    private String sex;
    private String age;
    //省略get set
}
/**
 * 教師類
 * @author easypanda
 * @date 2018-06-28
 */
public class Teacher {
    private String id;
    private String name;
    private String sex;
    private String age;
    private String course;//教學科目
    //省略get set
}
/**
 * 使用者工廠,可以產生各類使用者
 * @author easypanda
 * @date 2018-06-28
 */
public class UserFactory {
    public static User createUser(String userType){
        if(userType.equals("Teacher"))
            return new Teacher();
        else if(userType.equals("Student"))
            return new Student();
        else
            return null;
    }
}

工廠模式3.0——精準的產品線

產品多了有個問題啊,就是自己的業務員都弄不明白各種產品之間的區別,很容易搞錯。

比如上面的工廠,如果程式設計師忘了可以產生的使用者種類僅有Teacher和Student,他呼叫UserFactory .createUser("schoolmaster;")想弄個校長,結果就不成了,很容易引起錯誤。

如果控制呢,利用列舉就好了,因為列舉就是限定型別的啊。

/**
 * 使用者型別列舉
 * @author easypanda
 * @date 2018-06-28
 */
public enum UserType {
    STUDENT,TEACHER;
}
/**
 * 使用者工廠,可以產生各類使用者
 * @author easypanda
 * @date 2018-06-28
 */
public class UserFactory {
    public static User createUser(UserType userType){
        if(userType==UserType.TEACHER)
            return new Teacher();
        else if(userType==UserType.TEACHER)
            return new Student();
    }
}

這樣才生產的時候,必須嚴格按照已有型別生產:

User user=UserFactory.createUser(UserType.STUDENT);

總結

工廠模式說白了就是反覆做的生成物件的程式碼,放到工廠裡面批量做,以避免一個一個的做帶來的諸多問題——分散難以維護效率低。

同時在工廠裡也好集中監管,必須按照工藝規定(列舉)生產,保證了管理水平。