工厂模式的定义
定义一个创建对象的接口,让子类决定实例化哪个类。
工厂方法模式的使用场景
在任何需要生成复杂对象的地方,都可以使用工厂方法模式。复杂对象适合使用工厂模式。
工厂模式主要分为四大模块:
1.抽象工厂,其为工厂方法模式的核心。
2.具体工厂,其实现了具体的业务逻辑。
3.抽象产品,是工厂方法模式所创建的产品的父类。
4.具体产品,为实现抽象产品的某一个具体产品对象。
举例
这里我写了个简单的RxJava网络请求
需要:
1.抽象工厂
2.具体工厂
3.抽象产品
4.具体产品
抽象工厂
interface IRetrofitFactory {
//制造一个产品 参数为我的产品类型,返回值为抽象产品
fun makeProduct(type:RetrofitProductType):IRetrofitProduct
}
具体工厂
object RetrofitFacory : IRetrofitFactory {
//当给出不同的产品类型就返回不同的具体产品实例
override fun makeProduct(type: RetrofitProductType): IRetrofitProduct {
when (type) {
RetrofitProductType.GET -> {
return GetProduct()
}
RetrofitProductType.UPLOAD -> {
return UploadProduct()
}
RetrofitProductType.DOWNLOAD -> {
return DownloadProduct()
}
}
}
}
抽象产品
/*
* 抽象产品
* 需要做两件事
* 1.把具体产品创建出来
* 2.把产品返回给制造方
* */
interface IRetrofitProduct {
fun createProduct()
fun getProduct(): Retrofit?
}
具体产品
这里我只实现了一个类型的具体产品
/*
* 具体产品实现
* */
class GetProduct : IRetrofitProduct {
var retrofit: Retrofit? = null
override fun createProduct() {
retrofit = RetrofitUtils.getRetrofit() //生产产品
}
override fun getProduct(): Retrofit? {
if (retrofit == null) { //当产品还没被创建出来的时候创建产品返回
createProduct()
}
return retrofit
}
}
实现
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init() //初始化
RetrofitFacory
.makeProduct(RetrofitProductType.GET) //工厂的制造产品并指定需要的产品类型
.getProduct() //得到具体产品类实例在得到创建好的具体产品
?.create(API::class.java)
?.getXia()
?.subscribeOn(Schedulers.io())
?.observeOn(AndroidSchedulers.mainThread())
?.subscribe(object : Observer<XiaBean> {
override fun onSubscribe(d: Disposable) {
}
override fun onNext(t: XiaBean) {
Log.d("---", "aaa" + t.data[1].title)
list.addAll(t.data)
rvadapter?.notifyDataSetChanged()
}
override fun onError(e: Throwable) {
}
override fun onComplete() {
}
})
}
总体思路就是用你的工厂去制造一个产品(这里给一个产品类型),得到产品实例去创建出产品并返回
工厂模式的优缺点
优点: 封装对象创建过程的优点,降低客户端和工厂的耦合性.
缺点: 代码多,每创建一个对象,都要创建一个工厂