当前位置: 首页 > news >正文

Android设计模式--工厂模式

一,定义

工厂模式与Android 设计模式--单例模式-CSDN博客,Android设计模式--Builder建造者模式-CSDN博客,Android设计模式--原型模式-CSDN博客 一样,都是创建型设计模式。

工厂模式就是定义一个用于创建对象的接口,让子类决定实例化哪个类

二,使用场景

在任何需要生成复杂对象的地方,都可以使用工厂方法模式。复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂模式。

三,工厂模式简单使用

工厂模式主要分为四个模块:

1,抽象工厂,其为工厂模式的核心

2,具体工厂,其实现了具体的业务逻辑

3,抽象产品,是工厂方法模式所创建的产品的父类

4,具体产品,为实现抽象产品的某个具体产品的对象

下面来看一个简单的案例

某手机工厂可以生产三种手机,分别是手机A,手机B,手机C。

创建一个抽象的产品接口:

public interface Phone {void call();
}

创建具体的产品类:

public class PhoneA implements Phone{private static final String TAG = "phoneA";@Overridepublic void call() {Log.d(TAG,"我是手机A");}
}
public class PhoneB implements Phone{private static final String TAG = "PhoneB";@Overridepublic void call() {Log.d(TAG,"我是手机B");}
}

创建一个抽象的工厂接口:

public interface Factory {Phone createPhone();
}

创建具体的工厂类:

public class FactoryPhoneA implements Factory{@Overridepublic PhoneA createPhone() {return new PhoneA();}
}
public class FactoryPhoneB implements Factory{@Overridepublic PhoneB createPhone() {return new PhoneB();}
}

使用:

FactoryPhoneA factoryA =new FactoryPhoneA();
PhoneA phone =factoryA.createPhone();
phone.call();
FactoryPhoneB factoryB=new FactoryPhoneB();
PhoneB phoneB =factoryB.createPhone();
phoneB.call();

输出:

四,使用反射的工厂模式

还是上面的例子

抽象工厂接口可以改造为:

public interface Factory<T extends Phone> {T createPhone(Class<T> tClass);
}

具体的工厂类改造为:

public class PhoneFactory<T extends Phone> implements Factory<T>{@Overridepublic T createPhone(Class<T> tClass) {Phone phone =null;try {phone = (Phone) Class.forName(tClass.getName()).newInstance();} catch (Exception e) {throw new RuntimeException(e);}return (T) phone;}
}

这样在使用的时候,就class来动态的加载对象:

PhoneFactory phoneFactory =new PhoneFactory();
Phone phone1 = phoneFactory.createPhone(PhoneA.class);
phone1.call();
Phone phone2 = phoneFactory.createPhone(PhoneB.class);
phone2.call();

输出:

五,总结

总的来说,工厂模式是一个很好的设计模式,可以很优雅的创建对象,也符合设计原则。

缺点就是每增加一个新的产品,就会增加一个新的产品类,同时还要引入抽象层,这必然会导致类结构的复杂化,所以,在某些情况比较简单时,就没有必要非要去使用工厂模式。

参考文献:Android源码设计模式解析与实战第二版

http://www.lryc.cn/news/232769.html

相关文章:

  • EasyExcel入门使用教程
  • Golang实现一个一维结构体,根据某个字段排序
  • python语言实现背包问题动态规划
  • 将Python程序(.py)转换为Windows可执行文件(.exe)
  • Oracle 查找非系统用户结合了10,11,12,19
  • c++虚函数纯虚函数详解加代码解释
  • kotlin retrofit
  • Web 开发中 route 和 router 有什么区别?
  • VBA技术资料MF83:将Word文档批量另存为PDF文件
  • 通信原理板块——脉冲编码调制(PCM)
  • 绕过类安全问题分析方法
  • 基于STC12C5A60S2系列1T 8051单片的IIC总线器件数模芯片PCF8591实现数模转换应用
  • 2023年中国骨质疏松治疗仪发展趋势分析:小型且智能将成为产品优化方向[图]
  • 并发编程之生产者消费者模型
  • Java要将字符串转换为Map
  • 2760. 最长奇偶子数组 --力扣 --JAVA
  • JVM——运行时数据区(程序计数器+栈)
  • 【C++】数组中出现次数超过一半的数字
  • 3GPP协议解读(一)_23.501_23.502_PDU Session_SMF与UDP的交互
  • 天池2023智能驾驶汽车虚拟仿真视频数据理解--baseline
  • C++入门(1)—命名空间、缺省参数
  • 以程序员的身份使用curl获取速卖通详情
  • Java设计模式-结构型模式-装饰模式
  • 这7个“小毛病”项目经理必须克服
  • 一言成文大模型:大模型实践之路
  • 【VSCode】配置C/C++开发环境教程(Windows系统)
  • 算法实战:亲自写红黑树之四 插入insert的平衡
  • JWT 技术
  • 003.文件描述符、重定向
  • 图论| 827. 最大人工岛 127. 单词接龙