一、安卓设计模式(八)工厂方法模式
工厂方法模式是创建性设计模式之一,一般用于复杂对象的创建
该系列其他文章:
下面以Androd经常用到的缓存Cache来举例说明:
缓存接口,定义所有缓存必须实现的方法
工厂方法根据需求又用几种不同的实现,不过思想是一致的,下面分别说明
1.简单工厂(静态工厂)
如果我们程序中整体只需要一种缓存即可,不需要多种缓存,如磁盘缓存,所以只需要单一缓存子类及单一工厂即可:
2.工厂与产品一对一,即每个工厂负责生产一种产品
3.工厂与产品一对多,即每个工厂可以生产多种产品
工厂接口,定义所有工厂的必须实现的方法:
具体工厂,可根据需求生产不同的产品:
使用:
由以上可以的举例可以看到使用工厂方法创建对象简单明了,如果上面的缓存对象创建时需要设置很多参数,初始化数据等等,那么使用工厂方法模式相对于直接new一个实例有很大优势.工厂方法模式将对象的创建过程封装在工厂中,使得客户端无需再关心实例的创建和初始化过程.
实际开发中第三种使用的比较多,根据需求创建不同实例.
二、工厂设计模式(2)—枚举实现工厂模式
工厂设计模式(1)—普通的工厂模式
工厂设计模式(2)—枚举实现工厂模式
简单工厂模式的核心,负责创建所有实例的内部逻辑,工厂类可以被外界直接调用,创建所需的产品对象。
所创建所有对象的父类,负责描述所有实例的所共有的公共接口。
所创建的具体实例对象。
每个枚举项都是该枚举类的实例对象,那么是不是定义一个方法便可以生成每个枚举项对应产品。
1.抽象产品角色
2.具体产品角色
3.产品工厂
4.调用方式
枚举类型虽然不能继承,但是可以用abstract修饰其方法,此时表示该枚举是一个抽象枚举对象,需要每个枚举项自行实现该方法。
1.工厂方法
2.调用类
1.避免错误调用的产生
一般的静态工厂模式,需要接受客户端的参数来选择哪种具体产品的构建,这无形中会产生错误(比如null值问题,Class对象不存在)。但是枚举类型产生的工厂模式便不存在该问题,不需要传递任何参数,只需要选择生成什么类型的产品即可。
2.性能好,使用便捷
枚举类型的计算是以int类型的计算为基础的,这是最基本的操作,性能当然很快。
3.降低类间的耦合
普通方式实现的工厂模式,无论生产方法接收的是Class、String、Int类型,都会成为客户端的负担,这些类并不是客户度需要的,而是因为工厂方法的限制必须输入的。其实也就违背了Lod(最少知识原则):一个对象应该对其他对象有最少的了解。
三、Python设计模式:工厂方法模式
工厂,大家一般能想到的是生产产品的地方,在设计模式中,工厂可分为:简单工厂模式、工厂方法模式。在前期推文 Python简单工厂模式中有关于简单工厂模式的解读。
根据工厂的抽象程度可分为:工厂方法模式、抽象工厂模式。该模式用于封装和管理对象的创建,是一种创建型模式。
在简单工厂模式中,只提供了一个工厂类,该工厂类处于对产品类进行实例化的中心位置,它知道每一个产品对象的创建细节,并决定何时实例化哪一个产品类。
简单工厂模式最大的缺点是:当有新产品要加入到系统中时,必须修改工厂类,加入必要的处理逻辑,这违背了“开闭原则”。
在简单工厂模式中,所有的产品都是由同一个工厂创建,工厂类职责较重,业务逻辑较为复杂,具体产品与工厂类之间的耦合度高,严重影响了系统的灵活性和扩展性,而工厂方法模式则可以很好地解决这一问题。因此工厂方法模式应运而生。
(1)、工厂方法模式定义一个用于创建对象的接口,但是工厂本身并不负责创建对象,而是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。工厂方法的创建是通过继承而不是通过实例化来完成的。
(2)、工厂方法模式就是简单工厂模式的进一步抽象。由于面向对象多态性,工厂方法模式保持了简单工厂的优点同时克服了它的缺点。工厂方法模式中,核心的工厂被提升为一个抽象类,将具体的创建工作交给他的子类完成。
这个抽象的工厂类仅规定具体工厂实现的接口,而不明确指出如何实例化一个产品类,这使得工厂方法模式允许系统在不修改原有产品结构的情况下轻松的引进新产品。
工厂方法使设计更加具有可定制性,它可以返回相同的实例或子类,而不是某种类型的对象。
前期分享的 Python简单工厂模式和今天分享的Python工厂方法模式,大家在实际应用时能解决问题满足需求即可,可灵活变通,自由选择,无所谓哪种设计模式更高级。
同时无论哪种设计模式,由于可能封装了大量对象和工厂创建,当有新加入产品的需求时,需要修改已定义好的工厂相关的类,因此对于产品和工厂的扩展性不太友好,在选择使用时利弊需要权衡一下。
四、Java中常用的设计模式有哪些请详细说明一下工厂模式。
1.单例模式(有的书上说叫单态模式其实都一样)
该模式主要目的是使内存中保持1个对象
2.工厂模式
该模式主要功能是统一提供实例对象的引用。看下面的例子:
public class Factory{
public ClassesDao getClassesDao(){
ClassesDao cd= new ClassesDaoImpl();
return cd;
}
}
interface ClassesDao{
public String getClassesName();
}
class ClassesDaoImpl implements ClassesDao{
public String getClassesName(){
System.out.println("A班");
}
}
class test
{
public static void main(String[] args){
Factory f= new Factory();
f.getClassesDao().getClassesName();
}
}
这个是最简单的例子了,就是通过工厂方法通过接口获取对象的引用
3.建造模式
该模式其实就是说,一个对象的组成可能有很多其他的对象一起组成的,比如说,一个对象的实现非常复杂,有很多的属性,而这些属性又是其他对象的引用,可能这些对象的引用又包括很多的对象引用。封装这些复杂性,就可以使用建造模式。
4.门面模式
这个模式个人感觉像是Service层的一个翻版。比如Dao我们定义了很多持久化方法,我们通过Service层将Dao的原子方法组成业务逻辑,再通过方法向上层提供服务。门面模式道理其实是一样的。
5.策略模式
这个模式是将行为的抽象,即当有几个类有相似的方法,将其中通用的部分都提取出来,从而使扩展更容易。
OK,本文到此结束,希望对大家有所帮助。