设计模式主要分创建型、结构型、行为型,这篇文章主要记录本人使用Kotlin实现的创建型和结构型的12种设计模式,包括工厂模式、抽象工厂模式、单例模式、原型模式、建造者模式、适配器模式、组合模式、装饰器模式、享元模式、桥接模式、外观模式、静态代理模式。行为型设计模式在下一篇推出。
创建型
工厂模式
|
|
将工厂抽象出来,每次生成不同ID的相同产品时,使用相同的工厂生产同种产品。
抽象工厂模式
|
|
每次生成不同ID的相同产品族(比如这里可以指CompA_ProductA、CompA_ProductB构成的族等),使用相同工厂(这里指CompAFactory)生产同一族产品。
单例模式
原型模式
|
|
程序具体分析见本站之前的原型模式相关文章。
换了一种方式来写类的构造器,可见如果类名后没有显式添加()
,那么constructor方法不用写返回类型,而创建类的对象时不能省略参数。
Java里面采用super.clone()是因为对象调用clone()实际是委托了Object类的clone(),具体可以见文章最后的参考,Kotlin应该类似。
如果Fruitprototype声明为接口,那么运行时会报错,目前没有找到具体原因。
建造者模式
|
|
这里的建造者模式参照《Effective Java》来实现,有些设计模式的书籍强调建造者、监工、使用者等角色,在这里监工和使用者合二为一,监工表现为代码编写时的方法调用顺序(Builder方法的连环调用)。
结构型
适配器模式
|
|
有委托的实现方式就不采用继承,最后的as Target说明适配成功,可以应用在使用Target的场景。
组合模式
|
|
Leaf、Composite、Component是三个关键角色,Component是Leaf、Composite相似部分的抽象,包括getSize方法,toString方法等。Kotlin和Java的不同之一是Kotlin因为声明的不是字段而是属性,所以涉及到属性的override。
装饰器模式
|
|
代理模式和装饰器模式很像,有的时候也没必要分那么细,如果我问自己它们有什么区别,也只会从“哲学”的角度来回答:代理模式侧重“他是他你是你”,而装饰器模式侧重“你始终是你”。代理模式虽然代理了被代理对象的功能,但是终究不应该是原对象,所以需要new一个新的对象,再就是可能代理模式更强调代理动作的同一性吧(代理方法名相同),所以装饰器模式未必需要相同方法名的方法来装饰被装饰的方法。至于功能扩展什么的,从实现效果来看代理模式和装饰器模式都能扩展功能。
享元模式
|
|
基本代码和本站之前的文章一样,区别在于使用了伴生对象。在本站其它文章中的解析已经说明,伴生对象内的属性,实际上是外围类的属性,所以fruitMap声明在伴生对象内。
桥接模式
|
|
桥接模式在本人看来属于“功能代理实现”,这样新增功能和原本实现可以解耦合。在本例中,学生类的实现在一边,而活动的功能扩展在另一边,最基本的活动“代理”了学生的功能,但是扩展功能并不直接涉及学生类,这样就完成了解耦合。
外观模式
|
|
例子中facadeMethod方法给出了一个一致的界面,实现了一个简单的外观模式。
代理模式
|
|
这里暂时只给出静态代理,动态代理在本站关于AOP的部分中已经提到过。
参考
Why when implementing clone method we return super.clone() not this clone()