参考阅读:
Glide多种组合使用方式记录–没有全部亲测,大家可以根据实际需要选用 Glide设计模式之工厂模式1【ModelLoaderFactory】 Glide设计模式之工厂模式2【DiskCache.Factory】 Glide工厂模式3【TransitionFactory】【Transition】 Glide设计模式之工厂模式4总结
工厂模式的应用比较多;变化形态也是各种各样。但经过这段时间的解读。大概可以用浓缩为 1、不是使用new创建对象; 2、没有明显build方法创建对象; 3、带xxxFactory的几乎都满足工厂模式。 当然第3点比较明显。如果不带xxxFactory等这样的标识那看看是否有implements、extends。而且内部有类似创建对象的方法如:create([params]);这样也可以等同工厂模式实现形式。
几个典型工厂模式结构目标接口业务+n个实现类+工厂类
如菜鸟教程里的工厂模式 目标接口:interface Shape
实现类如下:
- class Square implements Shape
- class Circle implements Shape
- Rectangle implements Shape
工厂类:class ShapeFactory
目标产品业务接口+工厂业务接口+n个实现类
如下表:
产品业务接口工厂业务接口实现类ModelLoaderModelLoaderFactoryAssetUriLoader.FileDescriptorFactory, AssetUriLoader.StreamFactory, ByteArrayLoader.ByteBufferFactory, ByteArrayLoader.StreamFactory, ByteBufferFileLoader.Factory, DataUrlLoader.StreamFactory, FileLoader.Factory, FileLoader.FileDescriptorFactory, FileLoader.StreamFactory, HttpGlideUrlLoader.Factory, HttpUriLoader.Factory, MediaStoreFileLoader.Factory, MediaStoreImageThumbLoader.Factory, MediaStoreVideoThumbLoader.Factory, OkHttpUrlLoader.Factory, OkHttpUrlLoader.Factory, QMediaStoreUriLoader.FileDescriptorFactory, QMediaStoreUriLoader.InputStreamFactory, ResourceLoader.AssetFileDescriptorFactory, ResourceLoader.FileDescriptorFactory, ResourceLoader.StreamFactory, ResourceLoader.UriFactory, StringLoader.AssetFileDescriptorFactory, StringLoader.FileDescriptorFactory, StringLoader.StreamFactory, UnitModelLoader.Factory, UriLoader.AssetFileDescriptorFactory, UriLoader.FileDescriptorFactory, UriLoader.StreamFactory, UrlLoader.StreamFactory, UrlUriLoader.StreamFactory, VolleyUrlLoader.FactoryDiskCacheDiskCache.FactoryDiskCacheAdapter.Factory、 DiskLruCacheFactory、ExternalCacheDiskCacheFactory、ExternalPreferredCacheDiskCacheFactory、InternalCacheDiskCacheFactoryTransitionTransitionFactoryBitmapContainerTransitionFactory, BitmapTransitionFactory, DrawableCrossFadeFactory, NoTransition.NoAnimationFactory, ViewAnimationFactory, ViewPropertyAnimationFactoryn个目标业务接口+n个目标实现类+抽象类或接口工厂类+n个实现类工厂+组装厂
多个目标业务接口
- interface Shape
- interface Color
多个个目标实现类
- class Rectangle implements Shape
- class Square implements Shape
- class Circle implements Shape
- class Red implements Color
- class Green implements Color
- class Blue implements Color
抽象类或接口工厂类:
public abstract class AbstractFactory {
public abstract Color getColor(String color);
public abstract Shape getShape(String shape);
}
多个实现类工厂
- class ShapeFactory extends AbstractFactory
- class ColorFactory extends AbstractFactory
再加一个组装厂
public class FactoryProducer {
public static AbstractFactory getFactory(String choice){
if(choice.equalsIgnoreCase("SHAPE")){
return new ShapeFactory();
} else if(choice.equalsIgnoreCase("COLOR")){
return new ColorFactory();
}
return null;
}
}
一些感悟
熟悉理解了工厂模式之后再去读Java源码或者Android源码感觉会轻松不少 很多时候对象在哪创建的?这个不是特别好找到具体代码行,就像前面篇章里的单例模式。来来回回的调用了四五个方法后才开始创建单例对象。虽然繁琐但还算好找的了。在Android源码里很多对象的使用时去寻找创建对象的源头。发现跳转的很远的地方。 熟悉理解各种工厂模式的结构势在必行。对于读懂各大开源组件和Android系统源码有很大提升作用
面试说说工厂模式
答:可以直接给出本章的三种工厂模式结构。并进行一一说明使用场景,当然这个对组织语言表达要求较高一些。不过私下里多练习几篇,然后找同事或者同学对练几遍也就熟悉了。
进一步提问:为什么使用工厂模式
这个回答方向有很多。作者基于面向对象编程这方面说一些:工厂模式很明显的是定义好了生产目标业务接口。工厂实现可以随意,目标业务接口实现也可以任意。但最终的创建对象产品要满足业务接口的定义。这就达成了业务接口统一。解决了接口选择问题。 对外不涉及具体实现。只关注接口业务。 如此在扩展和维护上就很便利了。 当然还有进一步的深入,这里就不展开了。有兴趣留言讨论。
看完本章,希望读者们对于各种工厂模式的奇葩形式一眼看透。同时在谈起工厂模式你就是程序员里最靓的仔。
更多设计模式解读单例模式 Glide设计模式之单例模式 空对象模式 Glide设计模式之空对象模式【EmptyModelLoader】【EmptyList<E> 建造者模式 Glide多种组合使用方式记录–没有全部亲测,大家可以根据实际需要选用 Glide设计模式之建造者(builder)模式1【GlideBuilder】 Glide设计模式之建造者(builder)模式2【RequestBuilder】 Glide设计模式之建造者(builder)模式3【RequestOptions】【BaseRequestOptions】 Glide设计模式之建造者(builder)模式4总结【MemorySizeCalculator】【GlideExecutor】【PreFillType】【LazyHeaders】 工厂模式 Glide设计模式之工厂模式1【ModelLoaderFactory】 Glide设计模式之工厂模式2【DiskCache.Factory】 Glide工厂模式3【TransitionFactory】【Transition】 Glide设计模式之工厂模式4总结