当前位置: 首页 > news >正文

做网站分类链接/磁力蜘蛛搜索引擎

做网站分类链接,磁力蜘蛛搜索引擎,网站建设 电子商务网站开发,公司里开发app的叫什么本文节选自《设计模式就该这样学》 1 使用简单工厂模式封装产品创建细节 接下来看代码,还是以创建一门网络课程为例。假设有Java架构、大数据、人工智能等课程,已经形成了一个生态。我们可以定义一个课程标准ICourse接口。 public interface ICourse {…

本文节选自《设计模式就该这样学》

1 使用简单工厂模式封装产品创建细节

接下来看代码,还是以创建一门网络课程为例。假设有Java架构、大数据、人工智能等课程,已经形成了一个生态。我们可以定义一个课程标准ICourse接口。

public interface ICourse {/** 录制视频 */public void record();
}

创建一个Java课程的实现类JavaCourse。

public class JavaCourse implements ICourse {public void record() {System.out.println("录制Java课程");}
}

客户端调用代码如下。

public static void main(String[] args) {ICourse course = new JavaCourse();course.record();
}

由上面代码可知,父类ICourse指向子类JavaCourse的引用,应用层代码需要依赖JavaCourse。如果业务扩展,则继续增加PythonCourse,甚至更多,那么客户端的依赖会变得越来越臃肿。因此,我们要想办法把这种依赖减弱,把创建细节隐藏。虽然在目前的代码中,创建对象的过程并不复杂,但从代码设计角度来讲不易于扩展。因此,用简单工厂模式对代码进行优化。首先增加课程PythonCourse类。

public class PythonCourse implements ICourse {public void record() {System.out.println("录制Python课程");}
}

然后创建CourseFactory工厂类。

public class CourseFactory {public ICourse create(String name){if("java".equals(name)){return new JavaCourse();}else if("python".equals(name)){return new PythonCourse();}else {return null;}}
}

最后修改客户端调用代码。

public class SimpleFactoryTest {public static void main(String[] args) {CourseFactory factory = new CourseFactory();factory.create("java");}
}

当然,为了调用方便,可将CourseFactory的create()方法改为静态方法,其类图如下图所示。

图片

客户端调用虽然简单了,但如果业务继续扩展,要增加前端课程,则工厂中的create()方法就要随着产品链的丰富每次都要修改代码逻辑,这不符合开闭原则。因此,我们可以采用反射技术继续对简单工厂模式进行优化,代码如下。

public class CourseFactory {public ICourse create(String className){try {if (!(null == className || "".equals(className))) {return (ICourse) Class.forName(className).newInstance();}}catch (Exception e){e.printStackTrace();}return null;}
}

客户端调用代码修改如下。

public static void main(String[] args) {CourseFactory factory = new CourseFactory();ICourse course = factory.create("com.gupaoedu.vip.pattern.factory.simplefactory.JavaCourse");course.record();
}

优化之后,产品不断丰富,不需要修改CourseFactory中的代码。但问题是,方法参数是字符串,可控性有待提升,而且还需要强制转型。继续修改代码。

public ICourse create(Class<? extends ICourse> clazz){try {if (null != clazz) {return clazz.newInstance();}}catch (Exception e){e.printStackTrace();}return null;
}

优化客户端测试代码。

public static void main(String[] args) {CourseFactory factory = new CourseFactory();ICourse course = factory.create(JavaCourse.class);course.record();
}

最后来看如下图所示的类图。

图片

2 简单工厂模式在JDK源码中的应用

简单工厂模式在JDK源码中无处不在,例如Calendar类,看Calendar.getInstance()方法。下面打开的是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) {}}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 (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;
}

3 简单工厂模式在Logback源码中的应用

在大家经常使用的Logback中,可以看到LoggerFactory中有多个重载的方法getLogger()。

public static Logger getLogger(String name) {ILoggerFactory iLoggerFactory = getILoggerFactory();return iLoggerFactory.getLogger(name);
}public static Logger getLogger(Class clazz) {return getLogger(clazz.getName());
}

 

爆文阅读

  爆文阅读

95后阿里P7晒出工资单:狠补了这个,真香...

原来我才是内卷王,闭关3个月肝完Java 7大核心知识,成功斩获字节58万Offer。

太为难我了,阿里面试了7轮(5年经验,拿下P7岗offer)

 《设计模式就该这样学》之使用桥接模式设计复杂的消息系统

《设计模式就该这样学》之趣谈装饰器模式,让你一辈子不会忘

《设计模式就该这样学》之使用策略模式重构电商折扣和支付场景

《设计模式就该这样学》之委派模式详解

http://www.jmfq.cn/news/5247937.html

相关文章:

  • 网络营销课程多少钱/跟我学seo
  • 正规的网站制作电话多少/公司免费推广网站
  • 做外贸的经常浏览的三个网站/企业查询官网入口
  • wordpress不能发文章_只能在标题内写字/最优化方法
  • 深圳联雅网站建设/托管竞价推广公司
  • 网站可以做2个公司的吗/网络推广公司企业
  • 360极速浏览器网站开发缓存/百度人工客服在哪里找
  • 内部网站建设拓扑/站长工具源码
  • 所得税汇算是在12366网站做吗/长沙快速排名优化
  • 查看一个网站的备案人/信息流优化师没经验可以做吗
  • 注册500万公司每月交税/运营推广seo招聘
  • 网站做301打不开/产品网络营销策划方案
  • 望野拼音版注音/河南seo优化
  • 药品在网站上做标签有哪些分类/河南百度关键词优化排名软件
  • 青岛建网站多少钱/中文搜索引擎有哪些平台
  • 民政网站建设情况汇报/百度指数手机版
  • 网站代码怎么改/seo网站关键词优化软件
  • 帝国cms怎么做电影网站/企业网站类型有哪些
  • wordpress 手机浏览器/广州seo推广服务
  • 网站建设宣传/网络营销的专业知识
  • 阿克苏网站建设公司/网络推广协议合同范本
  • 做响应式网站最大宽度/中国纪检监察报
  • 云南做网站报价/百度教育会员
  • 肃宁县做网站价格/网络营销服务平台
  • 机房网络建设方案/如何优化seo
  • 林芝网站建设/哪里做网站便宜
  • 做理财网站 程序员 违法吗/新闻软文怎么写
  • 宜春建设网站公司/搜索引擎优化作业
  • 上海网站推广模板/手机优化专家
  • 做外贸都得有网站吗/北京seo网络优化师