彻底明白Android设计模式—工厂方法模式

封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的

ok,还是举个🌰,
既然是工厂模式,就打比方有一个工厂生产产品,首先要一个抽象产品类,描述产品的公共方法,以及两个具体的产品(手机产品和电视产品):

/**
     * 抽象产品类,所有产品的抽象父类,描述公共的方法部分
     */
    public abstract class Product {
        public abstract void dosomething();
    }

    /**
     * 具体产品类,所有产品的抽象父类,描述公共的方法部分
     * 这里比如想生产 手机产品,电视产品
     */
    public class PhoneProduct extends Product {

        @Override
        public void dosomething() {
            //具体事情实现,比如这里生产cpu,屏幕,摄像头等制作手机
        }
    }

    public class TvProduct extends Product {

        @Override
        public void dosomething() {
            //具体事情实现,比如这里生产电视屏幕,遥控器等
        }
    }

再把工厂的制造产品方法抽象出来,实现具体工厂类

 /**
     * 抽象工厂类,生产一个泛型的产品对象
     */
    public abstract class Factory {
        public abstract Product createProduct(Class<? extends Product> c);
    }


    /**
     * 具体工厂类,所有产品从这里生产,可以返回具体的产品对象
     */
    public class RealFactory extends Factory {

        public Product createProduct(Class<? extends Product> c) {
            Product product = null;
            try {
                product = (Product) Class.forName(c.getName()).newInstance();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return product;
        }
    }

ok,所有工作就绪,一套工厂系统完成,接下来就可以让工厂建造出不同的产品,而且需要新产品只需要实现Product接口即可,实现解耦

    public void main() {
        Factory factory = new RealFactory();
        Product product=factory.createProduct(PhoneProduct.class);
        product.dosomething();

    }

在Android中的应用

说个比较常见的需求吧,比如老板让你设计app中的支付功能,支付方式有很多,以后也有可能添加支付方式。
这时候就可以把支付方式抽象出来,用一个工厂类统一管理,用于返回具体的支付方式类。这样支付的时候,调用工厂类的方法,把具体支付方式传给工厂就可以了。

简单写下代码:

public abstract class PayChannel {
        public abstract void doInit();

        public abstract void doPay();
    }

    public abstract class PayFactory {
        public abstract Product createProduct(Class<? extends PayChannel> c);
    }

    public class PayFactory extends PayFactory {

        public PayChannel createProduct(Class<? extends PayChannel> c) {
            //这里可以做一些统一的操作,比如记录数据等
            PayChannel payChannel = null;
            try {
                payChannel = (PayChannel) Class.forName(c.getName()).newInstance();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return payChannel;
        }
    }

    public void main() {
        PayFactory payFactory = new PayFactory();
        PayChannel channel = payFactory.createProduct(WeixinPay.class);
        channel.doInit();
        channel.doPay();
    }

其实我想过为什么非要通过工厂这一层呢?直接通过抽象类的实现类执行方法不行吗?后面我想了下,我的理解是工厂类可以统一管理,并且做一些统一操作,就跟实际的工厂可以统一管理机器生产产品一样。

如果有说的不对的地方可以一起讨论下。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值