简介
只需要传入响应的参数就可以获取所需要的对象而无需知道其细节
工厂类的职责相对过重,增加新产品需要修改工厂类的判断逻辑
违背开闭原则
工厂类创建的对象比较少的情况下可已使用简单工厂
Coding
package com.yulang.design_pattern_23.simpleFactory;public class VideoFactory {public Video build(String type){if("java".equals(type)){return new JavaVideo();}else if ("python".equals(type)){return new PythonVideo();}else{throw new UnsupportedOperationException();}}}
package com.yulang.design_pattern_23.simpleFactory;public abstract class Video {public abstract void produce();}
package com.yulang.design_pattern_23.simpleFactory;public class JavaVideo extends Video {@Overridepublic void produce() {System.out.println("java");}}
package com.yulang.design_pattern_23.simpleFactory;public class PythonVideo extends Video {@Overridepublic void produce() {System.out.println("python");}}
package com.yulang.design_pattern_23.simpleFactory;public class Test {public static void main(String[] args) {VideoFactory videoFactory = new VideoFactory();videoFactory.build("java33").produce();}}
利用反射实现
package com.yulang.design_pattern_23.simpleFactory;public class VideoFactory {public Video build(Class c){Video video = null;try {video = (Video) Class.forName(c.getName()).newInstance();} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {e.printStackTrace();}return video;}}
package com.yulang.design_pattern_23.simpleFactory;public class Test {public static void main(String[] args) {VideoFactory videoFactory = new VideoFactory();videoFactory.build(JavaVideo.class).produce();}}
JDK源码
Calendar 类中的
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;}
**
