(最近在家中自学设计模式,参考网上的视频,做简单的理解记忆)工厂模式的设计也是为了减少对象之间的耦合关系。
不适用设计模式的订购与产品UML类图
如果不使用工厂模式,Pizza父类下有其子类不同的设计与实现,对于客户端OrderPizza对象就需要依赖Pizza以及依赖其子类,这样对象之间的耦合程度加大,如果有多个OrderPizza客户端时,每个客户端对象都需要依赖其他类。
简单工厂模式:是由一个工厂对象决定创建出哪一个产品类的实例对象
使用简单工厂的UML类图:
使用简单工厂设计模式,由工厂进行创建需要的产品类的实例对象。
工厂方法模式,对于同一个产品可能有多个工厂进行设计实现,其实现的方式或许有所不同,客户端访问时可以选择不同的工厂来进行创建不同的产品实例对象,但是不同的工厂会遵循相同的某种规则进行指定。
工厂方法模式的UML类图:
抽象工厂模式:定义一个接口interface用于创建相关或有依赖的对象族,不指定具体的类
抽象工厂相当于将简单工厂与工厂方法模式整合的结果。
工厂模式的使用场景:jdk中的Calendar类使用的是工厂模式
简单的源码如下:
//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) {
}
}
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;
}
工厂模式是将需要实例化的类进行同一管理和维护,进行与主项目解耦,提高项目的扩展性和维护性。
来源:CSDN
作者:study_**
链接:https://blog.csdn.net/weixin_43357889/article/details/104258311