簡(jiǎn)單工廠模式
- 定義
用戶輸入產(chǎn)品的名稱,工廠通過(guò)產(chǎn)品名稱負(fù)責(zé)生產(chǎn)具體的產(chǎn)品俱饿。
-
類圖
簡(jiǎn)單工廠模式的主要思想是定義一個(gè)工廠類歌粥,提供一個(gè)創(chuàng)建產(chǎn)品的方法,參數(shù)為產(chǎn)品名稱拍埠,通過(guò)case分支實(shí)現(xiàn)不同產(chǎn)品的實(shí)現(xiàn)失驶。客戶端只需要知道產(chǎn)品的名稱即可得到對(duì)應(yīng)的產(chǎn)品對(duì)象枣购。
SimpleFactory.png 具體實(shí)現(xiàn)
package com.tomas.simpleFactory;
//通過(guò)指定產(chǎn)品名稱和產(chǎn)品類的class實(shí)現(xiàn)創(chuàng)建產(chǎn)品
public class CourseFactory {
public ICourse createCourse(String courseName) {
if("Java".equals(courseName)){
return new JavaCourse();
}else if("Python".equals(courseName)){
return new PythonCourse();
}
//基于className的反射實(shí)現(xiàn)
// if(!( courseName == null || "".equals(courseName))){
// Class clazz = null;
// try {
// clazz = Class.forName(courseName);
// return (ICourse) clazz.newInstance();
//
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
return null;
}
//基于class的反射實(shí)現(xiàn)
public ICourse createCourse(Class <? extends ICourse> clazz) {
try {
return clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
package com.tomas.simpleFactory;
public interface ICourse {
void record();
}
package com.tomas.simpleFactory;
public class JavaCourse implements ICourse {
@Override
public void record() {
System.out.println("Java");
}
}
package com.tomas.simpleFactory;
public class PythonCourse implements ICourse {
@Override
public void record() {
System.out.println("Python");
}
}
package com.tomas.simpleFactory;
public class Test {
public static void main(String[] args) {
ICourse course = new CourseFactory().createCourse("Java");
course.record();
ICourse course1 = new CourseFactory().createCourse(JavaCourse.class);
course1.record();
}
}
- 應(yīng)用場(chǎng)景
適用于產(chǎn)品比較少并且比較穩(wěn)定的場(chǎng)景嬉探,例如Java中的
Calendar createCalendar(TimeZone zone,Locale aLocale) - 優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 應(yīng)用程序只需要和工廠類交互就可以獲得產(chǎn)品,不需要主動(dòng)去實(shí)例化棉圈,實(shí)現(xiàn)了代碼的解耦涩堤。
缺點(diǎn): - 名字嚴(yán)格區(qū)分大大小寫,名字如果傳錯(cuò)分瘾,無(wú)法生產(chǎn)出產(chǎn)品胎围。可以使用反射的方式解決德召。
- 如果產(chǎn)品頻繁增加或者變化白魂,需要修改源碼,不符合開(kāi)閉原則上岗。
工廠方法模式
- 定義
一個(gè)創(chuàng)建對(duì)象的接口福荸,由具體的實(shí)現(xiàn)類決定創(chuàng)建哪個(gè)產(chǎn)品。每個(gè)工廠只負(fù)責(zé)生產(chǎn)單一的一種產(chǎn)品肴掷。
-
類圖
工廠方法的主要思想是敬锐,創(chuàng)建一個(gè)抽象工廠背传,定義一個(gè)抽象產(chǎn)品,抽象工廠提供一個(gè)抽象創(chuàng)建方法來(lái)創(chuàng)建抽象產(chǎn)品台夺。具體這個(gè)創(chuàng)建方法創(chuàng)建出來(lái)什么產(chǎn)品径玖,由具體的工廠決定。這樣谒养,每一個(gè)產(chǎn)品只用來(lái)創(chuàng)建一種具體產(chǎn)品挺狰。
MethodFactory.png 具體實(shí)現(xiàn)
package com.tomas.factoryMethod;
public interface ICourse {
void record();
}
public interface ICourseFactory {
ICourse create();
}
package com.tomas.factoryMethod;
public class JavaCourse implements ICourse {
@Override
public void record() {
System.out.println("Java");
}
}
package com.tomas.factoryMethod;
public class JavaCourseFactory implements ICourseFactory {
@Override
public ICourse create() {
return new JavaCourse();
}
}
package com.tomas.factoryMethod;
public class PythonCourse implements ICourse {
@Override
public void record() {
System.out.println("Python");
}
}
package com.tomas.factoryMethod;
public class PythonCourseFactory implements ICourseFactory {
@Override
public ICourse create() {
return new PythonCourse();
}
}
public class Test {
public static void main(String[] args) {
ICourseFactory javaCourseFactory = new JavaCourseFactory();
javaCourseFactory.create().record();
ICourseFactory pythonCourseFactory = new PythonCourseFactory();
pythonCourseFactory.create().record();
}
}
- 應(yīng)用場(chǎng)景
一個(gè)類通過(guò)其子類決定具體的實(shí)現(xiàn)。
客戶端不依賴產(chǎn)品對(duì)象的創(chuàng)建細(xì)節(jié)买窟。 - 優(yōu)缺點(diǎn)
當(dāng)需要增加新的產(chǎn)品的時(shí)候丰泊,可以通過(guò)增加產(chǎn)品具體工廠和具體產(chǎn)品的方式進(jìn)行擴(kuò)展,符合開(kāi)閉原則始绍。但是這樣也帶來(lái)來(lái)類數(shù)量的劇增瞳购,增加類復(fù)雜度。
抽象工廠模式
- 定義
為創(chuàng)建一組相關(guān)或相互依賴的對(duì)象提供一個(gè)接口亏推,而且無(wú)須指定它們 的具體類学赛。
-
類圖
抽象工廠模式是工廠方法模式的延伸,其思想是吞杭,定義一個(gè)抽象工廠盏浇,里面有多個(gè)創(chuàng)建方法用于創(chuàng)建不同的產(chǎn)品⊙抗罚客戶端不依賴具體的產(chǎn)品創(chuàng)建和實(shí)現(xiàn)绢掰。
這里面的多個(gè)產(chǎn)品放在一起叫做產(chǎn)品族。通過(guò)具體的工廠來(lái)實(shí)現(xiàn)具體產(chǎn)品的創(chuàng)建童擎。例如美的工廠生產(chǎn)冰箱滴劲、彩電。格力工廠也生產(chǎn)冰箱顾复、彩電班挖。冰箱和彩電放一起就是產(chǎn)品族。
AbstractFactory.png 具體實(shí)現(xiàn)
package com.tomas.AbstractFactory;
public abstract class AbstractCourseFactory {
protected abstract INote createNote();
protected abstract IVideo createVideo();
}
package com.tomas.AbstractFactory;
public interface INote {
void note();
}
package com.tomas.AbstractFactory;
public interface IVideo {
void video();
}
package com.tomas.AbstractFactory;
public class JavaCourseFactory extends AbstractCourseFactory {
@Override
protected INote createNote() {
return new JavaNote();
}
@Override
protected IVideo createVideo() {
return new JavaVideo();
}
}
package com.tomas.AbstractFactory;
public class JavaNote implements INote {
@Override
public void note() {
System.out.println("Java Note");
}
}
package com.tomas.AbstractFactory;
public class JavaVideo implements IVideo {
@Override
public void video() {
System.out.println("Java Video");
}
}
package com.tomas.AbstractFactory;
public class PythonCourseFactory extends AbstractCourseFactory {
@Override
protected INote createNote() {
return new PythonNote();
}
@Override
protected IVideo createVideo() {
return new PythonVideo();
}
}
package com.tomas.AbstractFactory;
public class PythonNote implements INote {
@Override
public void note() {
System.out.println("Python Note");
}
}
package com.tomas.AbstractFactory;
public class PythonVideo implements IVideo {
@Override
public void video() {
System.out.println("Python Video");
}
}
public class TestAbstractFactory {
public static void main(String[] args) {
AbstractCourseFactory factory = new JavaCourseFactory();
INote note = factory.createNote();
note.note();
IVideo video = factory.createVideo();
video.video();
}
}
- 應(yīng)用場(chǎng)景
系統(tǒng)中出現(xiàn)產(chǎn)品族芯砸,并且每次只使用其中某一種產(chǎn)品族萧芙。 - 優(yōu)缺點(diǎn)
- 能夠清晰的描述產(chǎn)品族和產(chǎn)品等級(jí)的關(guān)系。
- 抽象工廠模式規(guī)定了產(chǎn)品族中包含的所有產(chǎn)品假丧,當(dāng)產(chǎn)品族發(fā)生變化的時(shí)候末购,所有的類都要做相應(yīng)的修改。
- 增加了系統(tǒng)的抽象性和理解難度虎谢。