設計模式使用例項(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);
總結
工廠模式說白了就是反覆做的生成物件的程式碼,放到工廠裡面批量做,以避免一個一個的做帶來的諸多問題——分散難以維護效率低。
同時在工廠裡也好集中監管,必須按照工藝規定(列舉)生產,保證了管理水平。