Kotlin基础知识的学习,请参考以前的文章:html

学习一门语言,没有必要掌握所有特性才去实践。入门以后能够开始阅读好的开源项目代码,本身动手实现一些简单的案例,有困难再去补充学习相关的知识点,这样反复的过程效果会比较好。测试

最近在从新学习设计模式,正好用Kotlin来实现对应的示例代码。本文就从简单工厂模式开始。spa

说明:设计模式的文字性解释参考或引用了这篇文章,做者的设计模式系列文章写得挺不错,感兴趣的朋友能够移步去阅读。因为做者没有给出具体的示例代码,因此本人打算在学习的同时,利用Java和Kotlin将各个模式实现一遍(虽然网上有现成代码),写出总结。目的是学习设计模式和Kotlin语言,分享过程当中的点滴。设计

1. 定义code

简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类建立型模式。在简单工厂模式中,能够根据参数的不一样返回不一样类的实例。简单工厂模式专门定义一个类来负责建立其余类的实例,被建立的实例一般都具备共同的父类。htm

2. 结构

Factory:工厂角色,负责实现建立全部实例的内部逻辑;

Product:抽象产品角色,是所建立的全部对象的父类,负责描述全部实例所共有的公共接口;

ConcreteProduct:具体产品角色,是建立目标,全部建立的对象都充当这个角色的某个具体类的实例。

3. 代码

3.1 Java

Product:

1 abstract classProduct {2 abstract voidprint();3 }

定义了抽象产品角色,及抽象方法print。

ConcreteProductA与ConcreteProductB:

1 classConcreteProductA extends Product {2 voidprint() {3 System.out.println("print of ConcreteProductA");4 }5 }6

7 classConcreteProductB extends Product {8 voidprint() {9 System.out.println("print of ConcreteProductB");10 }11 }

定义了两个具体产品角色,分别实现了print方法。

Factory:

1 classFactory {2 Product createProduct(String tag) {3 Product product = null;4 switch(tag) {5 case "A":6 product = newConcreteProductA();7 System.out.println("create ProductA");8 break;9 case "B":10 product = newConcreteProductB();11 System.out.println("create ProductB");12 break;13 default:14 break;15 }16

17 returnproduct;18 }19 }

工厂角色,实现了根据传入的参数来建立产品的功能。注意,新版的Java才能将String类型做为switch参数。

SimpleFactoryPattern:

1 public classSimpleFactoryPattern {2 public static voidmain(String[] args) {3 System.out.println("Simple Factory Pattern");4

5 Factory factory = newFactory();6 Product product = factory.createProduct("A");7 if (product != null) {8 product.print();9 }10 product = factory.createProduct("B");11 if (product != null) {12 product.print();13 }14 product = factory.createProduct("C");15 if (product != null) {16 product.print();17 }18 }19 }

测试用例,代码中加入了产品对象是否为null的判断,由于当用户传入错误的参数时是不能获得想要的产品的。

输出:

d592a2de8eb47aa23a449129f93c2a42.png

3.2 Kotlin

因为Kotlin和Java的实现只是代码上的不一样,因此下面只会说明存在差别的地方。之后要想由Kotlin转向Java,得先从细节上慢慢积累。虽然大多知识点在前面几篇文章有讲到,但仍是会提一下,温故而知新。

Product:

1 abstract classProduct {2 abstractfun print()3 }

方法定义添加fun关键字;语句结尾没有分号。

ConcreteProductA与ConcreteProductB:

1 classConcreteProductA: Product() {2 overridefun print() {3 println("print of ConcreteProductA")4 }5 }6

7 classConcreteProductB: Product() {8 overridefun print() {9 println("print of ConcreteProductB")10 }11 }

类继承用冒号代替extends关键字,基类名后添加括号;方法覆写添加override关键字;输出方法相似Python,没有System.out等繁琐的前缀。

Factory:

1 classFactory {2 fun createProduct(tag: String): Product?{3 var product: Product? = null

4 when (tag) {5 "A" ->{6 product =ConcreteProductA()7 println("create ProductA")8 }9 "B" ->{10 product =ConcreteProductB()11 println("create ProductB")12 }13 else ->{14 }15 }16

17 returnproduct18 }19 }

方法参数是变量在前,类型在后,用冒号隔离;方法返回类型写在方法名定义后,用冒号分离;没有返回值则可不写类型,或者写Unit;不肯定对象是否为空,声明时须加上问号;用when代替if或者switch结构更简洁易用。

SimpleFactoryPattern:

1 fun main(args: Array) {2 println("Simple Factory Pattern")3

4 val factory =Factory()5 var product: Product? = factory.createProduct("A")6 if (product != null) {7 product.print()8 }9 product = factory.createProduct("B")10 if (product != null) {11 product.print()12 }13 product = factory.createProduct("C")14 if (product != null) {15 product.print()16 }17 }

主方法不须要在外面套一个public类;对象建立不用加new关键字。

输出同上。

4. 优缺点

4.1 优势

工厂类含有必要的判断逻辑,能够决定在何时建立哪个产品类的实例,客户端能够免除直接建立产品对象的责任,而仅仅“消费”产品;简单工厂模式经过这种作法实现了对责任的分割,它提供了专门的工厂类用于建立对象;

客户端无须知道所建立的具体产品类的类名,只须要知道具体产品类所对应的参数便可,对于一些复杂的类名,经过简单工厂模式能够减小使用者的记忆量;

经过引入配置文件,能够在不修改任何客户端代码的状况下更换或增长新的具体产品类,在必定程度上提升了系统的灵活性。

4.2 缺点

因为工厂类集中了全部产品建立逻辑,一旦不能正常工做,整个系统都要受到影响;

使用简单工厂模式将会增长系统中类的个数,在必定程序上增长了系统的复杂度和理解难度;

系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能形成工厂逻辑过于复杂,不利于系统的扩展和维护;

简单工厂模式因为使用了静态工厂方法,形成工厂角色没法造成基于继承的等级结构。

5. 适用场景

工厂类负责建立的对象比较少:因为建立的对象较少,不会形成工厂方法中的业务逻辑太过复杂;

客户端只知道传入工厂类的参数,对于如何建立对象不关心:客户端既不须要关心建立细节,甚至连类名都不须要记住,只须要知道类型所对应的参数。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐