工廠模式是指用工廠方法代替new創(chuàng)建對(duì)象的模式,它主要解決new方法創(chuàng)建對(duì)象擴(kuò)展性不高及后期修改對(duì)象屬性,代碼修改量大的問題。
它的本質(zhì)就是為了將大量的初始化代碼從構(gòu)造方法中解脫出去,達(dá)到一個(gè)封裝的效果,減少在構(gòu)造方法中出現(xiàn)的錯(cuò)誤幾率,使創(chuàng)建對(duì)象更加的便捷、簡(jiǎn)單。
另外,同個(gè)對(duì)象不同的工廠方法,也可以更好的實(shí)現(xiàn)對(duì)類擴(kuò)展的功能。下面以一個(gè)例子簡(jiǎn)單的說明一下這個(gè)模式。
場(chǎng)景:公司Hr要招人,以設(shè)計(jì)師和工程師為例,看Hr如何用工廠模式進(jìn)行工作。
1. 由于Hr所招的人員都是為了工作,而這些人又同時(shí)要生活,這時(shí)候我們就可以定義一個(gè)接口,把他們共同的特點(diǎn)包裝起來(lái)。
package com.hrsystem;
public interface Employee{
public void work();
public void life();
}
2. 然后定義兩個(gè)子對(duì)象實(shí)現(xiàn)這個(gè)接口,這也是我們使用工廠方法具體所要?jiǎng)?chuàng)建的對(duì)象。
package com.hrsystem;
import com.hrsystem.Employee;
public class Designer implements Employee{
public void work(){
System.out.println("招了一個(gè)設(shè)計(jì)師來(lái)工作");
}
public void life(){
System.out.println("設(shè)計(jì)師工作結(jié)束下班回家生活");
}
}
package com.hrsystem;
import com.hrsystem.Employee;
public class Engineer implements Employee{
public void work(){
System.out.println("招了一個(gè)工程師來(lái)工作");
}
public void life(){
System.out.println("工程師工作結(jié)束就下班回家生活");
}
}
3. 創(chuàng)建完了這些具體的對(duì)象,我們需要一個(gè)工廠方法,這個(gè)方法主要是為了Hr能夠通過它來(lái)實(shí)現(xiàn)想招什么類型的人就招什么類型的人的功能。這也是工廠模式中最關(guān)鍵的一步。
package com.hrsystem;
import com.hrsystem.Employee;
public class HrSystem{
public static Employee employeePerson(Class c){
Employee employee = null;
try {
employee = (Employee) Class.forName(c.getName()).newInstance();
}catch(InstantiationException e){
System.out.println("必須指定招的人的類型");
}catch(IllegalAccessException e){
System.out.println("人員類型錯(cuò)誤");
}catch(ClassNotFoundException e){
System.out.println("沒有這種人");
}
return employee;
}
}
4. 當(dāng)我們完成了以上的工作,我們就可以令Hr去按照他的需求去工作了。
package com.hrsystem;
import com.hrsystem.Employee;
import com.hrsystem.HrSystem;
public class Hr{
public static void main(String[] args){
Employee employee = HrSystem.employeePerson(Designer.class);//在這里Hr想要招什么樣的人,就用此方法創(chuàng)建什么樣的對(duì)象
employee.work();
employee.life();
}
}