工厂模式分为三种类型html
指由一个工厂对象决定建立出哪种产品类的实例java
public interface ICourse { /** * 录制课程 */ void record(); }
public class JavaCourse implements ICourse { /** * 录制 java 课程 */ @Override public void record() { System.out.println("正在录制 java 课程"); } }
public class CourseFactory { /** * 经过名称建立对象 * @param name * @return */ public ICourse createByName(String name) { if ("java".equals(name)) { return new JavaCourse(); } else { return null; } } /** * 经过类路径建立对象 * @param classPath * @return */ public ICourse createByClassPath(String classPath) { try { if (StringUtils.isNotBlank(classPath)) { return (ICourse) Class.forName(classPath).newInstance(); } } catch (Exception e) { e.printStackTrace(); } return null; } /** * 经过类建立对象 * @param className * @return */ public ICourse createByClass(Class className) { try { if (null != className) { return (ICourse) className.newInstance(); } } catch (Exception e) { e.printStackTrace(); } return null; } }
public class SimelpFactoryTest { public static void main(String[] args) { CourseFactory courseFactory = new CourseFactory(); // 经过类名建立对象 ICourse nameCourse = courseFactory.createByName("java"); nameCourse.record(); // 经过类路径建立对象 ICourse classNameCourse = courseFactory.createByClassPath("com.zhunongyun.toalibaba.designpatterns.factory.common.JavaCourse"); classNameCourse.record(); // 经过类建立对象 ICourse classCourse = courseFactory.createByClass(JavaCourse.class); classCourse.record(); ICourse pythonCourse = courseFactory.createByName("python"); pythonCourse.record(); } }
Calendar 是一个日历工具,使用简单工厂模式建立实体类Calendarcalendar=Calendar.getInstance();
python
Calendar 的 getInstance()的代码就是经过简单工厂的方式去建立 Calendar 对象ide
public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar> { public static Calendar getInstance() { return createCalendar(TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT)); } ...... private static Calendar createCalendar(TimeZone zone, Locale aLocale) { CalendarProvider provider = LocaleProviderAdapter.getAdapter(CalendarProvider.class, aLocale).getCalendarProvider(); if (provider != null) { try { return provider.getInstance(zone, aLocale); } catch (IllegalArgumentException iae) { // fall back to the default instantiation } } Calendar cal = null; if (aLocale.hasExtensions()) { String caltype = aLocale.getUnicodeLocaleType("ca"); if (caltype != null) { switch (caltype) { case "buddhist": cal = new BuddhistCalendar(zone, aLocale); break; case "japanese": cal = new JapaneseImperialCalendar(zone, aLocale); break; case "gregory": cal = new GregorianCalendar(zone, aLocale); break; } } } if (cal == null) { // If no known calendar type is explicitly specified, // perform the traditional way to create a Calendar: // create a BuddhistCalendar for th_TH locale, // a JapaneseImperialCalendar for ja_JP_JP locale, or // a GregorianCalendar for any other locales. // NOTE: The language, country and variant strings are interned. if (aLocale.getLanguage() == "th" && aLocale.getCountry() == "TH") { cal = new BuddhistCalendar(zone, aLocale); } else if (aLocale.getVariant() == "JP" && aLocale.getLanguage() == "ja" && aLocale.getCountry() == "JP") { cal = new JapaneseImperialCalendar(zone, aLocale); } else { cal = new GregorianCalendar(zone, aLocale); } } return cal; } }
LoggerFactory 是日志工厂类,经过简单工厂建立对象Loggerlogger=LoggerFactory.getLogger("xx");
工具
LoggerFactory 的 getLogger()的代码就是经过简单工厂的方式去建立 Logger 对象源码分析
public final class LoggerFactory { public static Logger getLogger(String name) { ILoggerFactory iLoggerFactory = getILoggerFactory(); return iLoggerFactory.getLogger(name); } public static Logger getLogger(Class<?> clazz) { Logger logger = getLogger(clazz.getName()); if (DETECT_LOGGER_NAME_MISMATCH) { Class<?> autoComputedCallingClass = Util.getCallingClass(); if (autoComputedCallingClass != null && nonMatchingClasses(clazz, autoComputedCallingClass)) { Util.report(String.format("Detected logger name mismatch. Given name: \"%s\"; computed name: \"%s\".", logger.getName(), autoComputedCallingClass.getName())); Util.report("See http://www.slf4j.org/codes.html#loggerNameMismatch for an explanation"); } } return logger; } }
指定义一个建立对象的接口,但让实现这个接口的类来决定实例化哪一个类,工厂方法让类的实例化推迟到子类中进行测试
产品抽象类日志
public interface ICourse { /**
* 录制课程
*/
void record();
}
具体产品类code
public class JavaCourse implements ICourse { /**
* 录制 java 课程
*/
@Override
public void record() {
System.out.println("正在录制 java 课程");
}
}
建立对象的工厂接口类orm
public interface ICourseFactory { /**
* 建立实体类
* @return
*/
ICourse create();
}
具体产品工厂类
public class JavaCourseFactory implements ICourseFactory { /**
* 建立 java 课程实体类
* @return
*/
@Override
public ICourse create() {
return new JavaCourse();
}
}
测试类
public class FactoryMethodTest { public static void main(String[] args) {
ICourseFactory courseFactory = new JavaCourseFactory();
ICourse course = courseFactory.create();
course.record();
}
}
LoggerFactory 的 getLogger()的代码中ILoggerFactory iLoggerFactory = getILoggerFactory();
,经过工厂方法模式建立出具体 Logger 的工厂类
public final class LoggerFactory { public static Logger getLogger(String name) { ILoggerFactory iLoggerFactory = getILoggerFactory(); return iLoggerFactory.getLogger(name); } public static ILoggerFactory getILoggerFactory() { if (INITIALIZATION_STATE == 0) { Class var0 = LoggerFactory.class; synchronized(LoggerFactory.class) { if (INITIALIZATION_STATE == 0) { INITIALIZATION_STATE = 1; performInitialization(); } } } switch(INITIALIZATION_STATE) { case 1: return SUBST_FACTORY; case 2: throw new IllegalStateException("org.slf4j.LoggerFactory in failed state. Original exception was thrown EARLIER. See also http://www.slf4j.org/codes.html#unsuccessfulInit"); case 3: return StaticLoggerBinder.getSingleton().getLoggerFactory(); case 4: return NOP_FALLBACK_FACTORY; default: throw new IllegalStateException("Unreachable code"); } } }
指提供一个建立一系列相关或相互依赖对象的接口,无需指定他们具体的类
产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是手机,其子类有华为手机,小米手机,苹果手机,则抽象手机与具体品牌的手机之间构成了一个产品等级结构,抽象手机是父类,而具体品牌的手机是其子类
产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不一样产品等级结构中的一组产品,如华为工厂生产的华为手机,华为笔记本,华为手机位于手机产品等级结构中,华为笔记本位于笔记本产品等级结构中,华为手机,华为笔记本构成了一个产品族
java public interface ICourse {
/**
* 录制课程
*/
void record();
}
public interface INote { /** * 编写课程笔记 */ void write(); }
public interface IVideo { /** * 处理课程视频 */ void handle(); }
java public class JavaCourse implements ICourse {
/**
* 录制 java 课程
*/
@Override
public void record() {
System.out.println("正在录制 java 课程");
}
}
public class JavaNote implements INote { @Override public void write() { System.out.println("正在编写 java 课程笔记"); } }
public class JavaVideo implements IVideo { @Override public void handle() { System.out.println("正在处理 java 课程视频"); } }
建立对象的工厂接口类
public interface ICourseFactory { /**
* 录制课程
* @return
*/
ICourse createCourse();
/**
* 编写课程笔记
* @return
*/
INote creatNode();
/**
* 处理课程视频
* @return
*/
IVideo createVideo();
}
具体产品工厂类
public class JavaCourseFactory implements ICourseFactory { @Override
public ICourse createCourse() {
return new JavaCourse();
}
@Override
public INote creatNode() {
return new JavaNote();
}
@Override
public IVideo createVideo() {
return new JavaVideo();
}
}
测试类
public class AbstractFactoryTest { public static void main(String[] args) {
ICourseFactory courseFactory = new JavaCourseFactory();
// 录制 java 课程
courseFactory.createCourse().record();
// 编写 java 课程笔记
courseFactory.creatNode().write();
// 处理 java 课程视频
courseFactory.createVideo().handle();
}
}
Spring 中的 AbstractBeanFactory 类
public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory { ...... protected abstract boolean containsBeanDefinition(String var1); protected abstract BeanDefinition getBeanDefinition(String var1) throws BeansException; protected abstract Object createBean(String var1, RootBeanDefinition var2, @Nullable Object[] var3) throws BeanCreationException; }
AbstactBeanFactory 的三个实现类: