博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简单工厂模式(Java与Kotlin版)
阅读量:6844 次
发布时间:2019-06-26

本文共 4523 字,大约阅读时间需要 15 分钟。

 

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

 

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

 

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

 

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

 

1. 定义

简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

 

2. 结构

Factory:工厂角色,负责实现创建所有实例的内部逻辑;

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

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

 

3. 代码

3.1 Java

Product:

1 abstract class Product {2     abstract void print();3 }

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

ConcreteProductA与ConcreteProductB:

1 class ConcreteProductA extends Product { 2     void print() { 3         System.out.println("print of ConcreteProductA"); 4     } 5 } 6  7 class ConcreteProductB extends Product { 8     void print() { 9         System.out.println("print of ConcreteProductB");10     }11 }

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

Factory:

1 class Factory { 2     Product createProduct(String tag) { 3         Product product = null; 4         switch (tag) { 5             case "A": 6                 product = new ConcreteProductA(); 7                 System.out.println("create ProductA"); 8                 break; 9             case "B":10                 product = new ConcreteProductB();11                 System.out.println("create ProductB");12                 break;13             default:14                 break;15         }16 17         return product;18     }19 }

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

SimpleFactoryPattern:

1 public class SimpleFactoryPattern { 2     public static void main(String[] args) { 3         System.out.println("Simple Factory Pattern"); 4  5         Factory factory = new Factory(); 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的判断,因为当用户传入错误的参数时是不能得到想要的产品的。

输出:

 

3.2 Kotlin

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

Product:

1 abstract class Product {2     abstract fun print()3 }

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

ConcreteProductA与ConcreteProductB:

1 class ConcreteProductA: Product() { 2     override fun print() { 3         println("print of ConcreteProductA") 4     } 5 } 6  7 class ConcreteProductB: Product() { 8     override fun print() { 9         println("print of ConcreteProductB")10     }11 }

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

Factory:

1 class Factory { 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         return product18     }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. 适用场景

工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂;

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

转载地址:http://krbul.baihongyu.com/

你可能感兴趣的文章
Flex 动态创建 多个曲线图/柱形图 ColumnSeries
查看>>
http中post和get的区别
查看>>
从硬盘安装ubuntu的方法
查看>>
TCPDUMP中文手册
查看>>
apache 403 forbidden 错误解决方法
查看>>
ERP实施流程-步骤
查看>>
谈Excel的一些操作
查看>>
24.NAT地址转换技术
查看>>
mahout所实现的算法
查看>>
MFC中的CListCtrl网格控件添加行
查看>>
orzdba安装与使用
查看>>
Ansible API 2.0的测试
查看>>
LVS的三种负载均衡技术,八大负载调度算法
查看>>
linux 常用小命令
查看>>
AIX系列------ISO挂载
查看>>
数据库笔记10:插入数据 创建和操纵表
查看>>
重启citrix服务器,无法打开发布的程序
查看>>
cygwin openssh for windows
查看>>
按照文件名中包含的版本号信息对文件名列表进行排序
查看>>
jQuery学习笔记3:过滤器
查看>>