在工廠模式中洼哎,我們?cè)趧?chuàng)建對(duì)象時(shí)不會(huì)對(duì)客戶端暴露創(chuàng)建邏輯,并且是通過使用一個(gè)共同的接口來(lái)指向新創(chuàng)建的對(duì)象榆俺。
簡(jiǎn)單工廠模式
簡(jiǎn)單工廠模式是由一個(gè)工廠對(duì)象決定產(chǎn)生出哪一類產(chǎn)品類的實(shí)例暂殖。
實(shí)現(xiàn)一個(gè)基本的工廠模式
public interface ICourse {
public void record();
}
public class JavaCourse implements ICourse {
@Override
public void record() {
System.out.println("Java課程");
}
}
public class PythonCourse implements ICourse{
@Override
public void record() {
System.out.println("Python course");
}
}
//調(diào)用
public static void main(String[] args) {
ICourse course = new JavaCourse();
course.record();
}
如果業(yè)務(wù)拓展,我們的課程越來(lái)越多,那么我們的代碼就會(huì)顯得很笨重斋扰。因此渡八,想辦法把依賴減弱,把實(shí)現(xiàn)細(xì)節(jié)隱藏起來(lái)传货。
//創(chuàng)建一個(gè)課程工廠
public class CourseFactory {
public ICourse getCourse(String name) {
switch (name) {
case "Java":
return new JavaCourse();
case "Python":
return new PythonCourse();
default:
throw new RuntimeException("沒有該課程");
}
}
}
//修改調(diào)用方法
public static void main(String[] args) {
CourseFactory courseFactory = new CourseFactory();
courseFactory.getCourse("Java").record();
}
客戶端變簡(jiǎn)單了屎鳍,但是每次新增課程,都要在CourseFactory中修改邏輯问裕,不符合開閉原則逮壁。我們要繼續(xù)修改,在這里用到了反射粮宛。
public class CourseFactory {
public ICourse getCourse(Class<? extends ICourse> clazz) {
try {
if (clazz!= null){
return clazz.newInstance();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
public static void main(String[] args) {
CourseFactory courseFactory = new CourseFactory();
courseFactory.getCourse(JavaCourse.class).record();
}
抽象工廠模式
抽象工廠模式(Abstract Factory Pattern)是圍繞一個(gè)超級(jí)工廠創(chuàng)建其他工廠窥淆。該超級(jí)工廠又稱為其他工廠的工廠。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式巍杈,它提供了一種創(chuàng)建對(duì)象的最佳方式忧饭。
在抽象工廠模式中,接口是負(fù)責(zé)創(chuàng)建一個(gè)相關(guān)對(duì)象的工廠筷畦,不需要顯式指定它們的類词裤。每個(gè)生成的工廠都能按照工廠模式提供對(duì)象。
FactoryProducer 用來(lái)提供創(chuàng)建工廠的方法鳖宾,筆記工廠和課程工廠分別提供筆記和課程吼砂。
超級(jí)工廠類:
public interface AbstractFactory {
public ICourse getCourse(String course);
public INote getNote(String note);
}
課程工廠類:
public class CourseFactory implements AbstractFactory{
@Override
public ICourse getCourse(String course) {
switch (course){
case "JavaCourse":
return new JavaCourse();
default:
throw new RuntimeException("no such Course");
}
}
@Override
public INote getNote(String note) {
return null;
}
}
筆記工廠類:
public class NoteFactory implements AbstractFactory {
@Override
public ICourse getCourse(String course) {
return null;
}
@Override
public INote getNote(String note) {
switch (note) {
case "JavaNote":
return new JavaNote();
default:
throw new RuntimeException("no such Note");
}
}
}
課程工廠和筆記工廠都是圍繞超級(jí)工廠創(chuàng)建的類。
課程接口:
public interface ICourse {
public void createCourse();
}
課程實(shí)現(xiàn)類:
public class JavaCourse implements ICourse{
@Override
public void createCourse() {
System.out.println("JavaCourse");
}
}
調(diào)用過程
public static void main(String[] args) {
AbstractFactory factory = FactoryProducer.getFactory("Course");
ICourse course =factory.getCourse("JavaCourse");
course.createCourse();
}