设计模式-2工厂设计模式
1.简单工厂模式(静态工厂模式)
传统的设计模式:
优点 | 简单理解,简单操作 |
---|---|
缺点 | 违反了设计模式的OCP原则,即对扩展开放,对修改关闭的原则 |
简单工厂模式:
- 属于创建型模式,简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式
- 定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)
2.工厂方法模式
工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类
3.抽象工厂模式
1、抽象工厂模式:定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类
2、抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合
3、从设计层面看,抽象工厂模式就是对简单工厂模式的改进(进一步的抽象)
4、将工厂抽象成两层,AbsFactory(抽象工厂)和具体实现的工厂子类。可以根据创建对象类型使用对应的工厂子类。这样将单个的简单的工厂类变成了工厂簇,更利于代码的维护和扩展
4、工厂模式模式
在jdk中的例子:
Calendar calendar = Calendar.getInstance();
//二级
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;
}
小结:
- 意义:将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。
- 设计模式的依赖抽象原则
- 创建对象实例的时候,不要直接new,而是把这个new类的动作放在一个工厂的方法中,并返回。
- 不要让类继承具体类,而是继承抽象或者是实现interface(接口)
- 不要覆盖基类中已经实现的方法
ZGC说:有什么能比不给牛吃草,还挤牛奶更快乐的事情呢?