简介

只需要传入响应的参数就可以获取所需要的对象而无需知道其细节
工厂类的职责相对过重,增加新产品需要修改工厂类的判断逻辑
违背开闭原则

工厂类创建的对象比较少的情况下可已使用简单工厂

Coding

  1. package com.yulang.design_pattern_23.simpleFactory;
  2. public class VideoFactory {
  3. public Video build(String type){
  4. if("java".equals(type)){
  5. return new JavaVideo();
  6. }else if ("python".equals(type)){
  7. return new PythonVideo();
  8. }else{
  9. throw new UnsupportedOperationException();
  10. }
  11. }
  12. }
  1. package com.yulang.design_pattern_23.simpleFactory;
  2. public abstract class Video {
  3. public abstract void produce();
  4. }
  1. package com.yulang.design_pattern_23.simpleFactory;
  2. public class JavaVideo extends Video {
  3. @Override
  4. public void produce() {
  5. System.out.println("java");
  6. }
  7. }
  1. package com.yulang.design_pattern_23.simpleFactory;
  2. public class PythonVideo extends Video {
  3. @Override
  4. public void produce() {
  5. System.out.println("python");
  6. }
  7. }
  1. package com.yulang.design_pattern_23.simpleFactory;
  2. public class Test {
  3. public static void main(String[] args) {
  4. VideoFactory videoFactory = new VideoFactory();
  5. videoFactory.build("java33").produce();
  6. }
  7. }

利用反射实现

  1. package com.yulang.design_pattern_23.simpleFactory;
  2. public class VideoFactory {
  3. public Video build(Class c){
  4. Video video = null;
  5. try {
  6. video = (Video) Class.forName(c.getName()).newInstance();
  7. } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
  8. e.printStackTrace();
  9. }
  10. return video;
  11. }
  12. }
  1. package com.yulang.design_pattern_23.simpleFactory;
  2. public class Test {
  3. public static void main(String[] args) {
  4. VideoFactory videoFactory = new VideoFactory();
  5. videoFactory.build(JavaVideo.class).produce();
  6. }
  7. }

JDK源码

Calendar 类中的

  1. private static Calendar createCalendar(TimeZone zone,
  2. Locale aLocale)
  3. {
  4. CalendarProvider provider =
  5. LocaleProviderAdapter.getAdapter(CalendarProvider.class, aLocale)
  6. .getCalendarProvider();
  7. if (provider != null) {
  8. try {
  9. return provider.getInstance(zone, aLocale);
  10. } catch (IllegalArgumentException iae) {
  11. // fall back to the default instantiation
  12. }
  13. }
  14. Calendar cal = null;
  15. if (aLocale.hasExtensions()) {
  16. String caltype = aLocale.getUnicodeLocaleType("ca");
  17. if (caltype != null) {
  18. switch (caltype) {
  19. case "buddhist":
  20. cal = new BuddhistCalendar(zone, aLocale);
  21. break;
  22. case "japanese":
  23. cal = new JapaneseImperialCalendar(zone, aLocale);
  24. break;
  25. case "gregory":
  26. cal = new GregorianCalendar(zone, aLocale);
  27. break;
  28. }
  29. }
  30. }
  31. if (cal == null) {
  32. // If no known calendar type is explicitly specified,
  33. // perform the traditional way to create a Calendar:
  34. // create a BuddhistCalendar for th_TH locale,
  35. // a JapaneseImperialCalendar for ja_JP_JP locale, or
  36. // a GregorianCalendar for any other locales.
  37. // NOTE: The language, country and variant strings are interned.
  38. if (aLocale.getLanguage() == "th" && aLocale.getCountry() == "TH") {
  39. cal = new BuddhistCalendar(zone, aLocale);
  40. } else if (aLocale.getVariant() == "JP" && aLocale.getLanguage() == "ja"
  41. && aLocale.getCountry() == "JP") {
  42. cal = new JapaneseImperialCalendar(zone, aLocale);
  43. } else {
  44. cal = new GregorianCalendar(zone, aLocale);
  45. }
  46. }
  47. return cal;
  48. }

**