Android常用设计模式之工厂模式理解

前言

工厂就是批量生产产品的地方,那么在android开发中工厂模式也可以理解为生产对象的一种模式。使用工厂模式可以把对象的具体创建和使用分开,使用者不必关心对象是如何创建的只需使用即可。

工厂模式

工厂模式是创建型模式,是android开发中常见的设计模式之一,一般用于生产复杂对象的地方。工厂模式降低了对象之间的耦合,由于工厂模式依赖抽象的架构,实例化的任务交给子类去完成,所以有很好的扩展性。
工厂模式分为普通工厂模式和抽象工厂模式。

普通工厂模式

创建同类产品的不同类型,如华为手机苹果手机都是手机。

普通工厂模式例子

定义一个Phone的抽象类。

public abstract class Phone {
    public abstract void phoneName();
}

提供一个抽象方法phoneName(),是手机的名称。
定义一个具体的手机。

public class Mate50Phone extends Phone{
    @Override
    public void phoneName() {

    }
}

定义了一个Mate50Phone 继承了Phone并实现了phoneName方法。
产品定义好了,下面定义工厂。

public abstract class PhoneFactory {
    public abstract <T extends Phone> T createPhone(Class<T> clz);
}

工厂的作用就是生产Phone ,所以提供了一个抽象方法createPhone。下面具体实现这个工厂。

public class HuaWeiPhoneFactory  extends PhoneFactory {
    @Override
    public <T extends Phone> T createPhone(Class<T> clz) {
        Phone phone = null;
        try {
            phone = (Phone) Class.forName(clz.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T) phone;
    }
}

HuaWeiPhoneFactory 工厂也很简单就实现了抽象方法createPhone,来生产不同的手机。这里我们使用了反射方法。

  phone = (Phone) Class.forName(clz.getName()).newInstance();

就是说通过类名(ClassName)来实例化具体的类,是用反射机制来实现的。生产不同的手机只需传入不同的类即可。
生产不同的手机只需新建一个类继承Phone即可。

        HuaWeiPhoneFactory huaWeiPhoneFactory=new HuaWeiPhoneFactory();
        Mate50Phone mate50Phone=huaWeiPhoneFactory.createPhone(Mate50Phone.class);
        mate50Phone.phoneName();
        Mate50PhonePro mate50PhonePro=huaWeiPhoneFactory.createPhone(Mate50PhonePro.class);
        mate50PhonePro.phoneName();

到此一个简单的普通工厂模式就结束了。

简单工厂模式总结:

1.普通工厂模式:生产具体的产品,创建的产品是类(Class)

简单工厂模式优缺点:

优点:客户端需要什么产品,可以直接得到,逻辑判断在工厂里面。
缺点:扩展性一般,产品都是一个产品族下面的产品,对于不在产品族中的产品,没办法去扩展,另外获得具体某种产品的逻辑放在工厂里面,新添加产品的时候就需要修改工厂里面的代码。

抽象工厂模式

创建不同类的产品,如手机CPU和电池是不同的产品

抽象工厂模式的例子

定义一个手机(处理器)的零件Processor,定义一个抽象产品CPU。

public interface Processor {
    public interface CPU {
        void showCpuName();
    }
}

然后定义一个CPU的具体产品Snapdragon8Plus(骁龙8+)。

public class Snapdragon8Plus implements Processor.CPU{
    @Override
    public void showCpuName() {

    }
}

public class Snapdragon8Gen14 implements Processor.CPU{
    @Override
    public void showCpuName() {

    }
}

产品定义好了,下面定义工厂,抽象出工厂类的方法。

public abstract class Factory {
    public abstract Processor.CPU createCPU();
}

注意一点这里的抽象方法跟抽象工厂模式并无实际关系,不是因为这里使用抽象类而因此叫抽象工厂模式,而是因为工厂模式生产的产品Processor.CPU抽象出来的,抽象工厂模式因此而来。

接着我们看具体工厂的实现。

public class Mate50Factory extends Factory{
    @Override
    public Processor.CPU createCPU() {
        return new Snapdragon8Plus();
    }
}

public class Mate50ProFactory extends Factory{
    @Override
    public Processor.CPU createCPU() {
        return new Snapdragon8Gen14();
    }
}

可以看到Mate50Factory 和Mate50ProFactory 两个工厂模式他们创建的产品相同,都是创建CPU这个抽象产品。只是型号不同,一个型号是Snapdragon8Plus,一个型号是Snapdragon8Gen14。而这两个产品又是通过不同子类来实现的。

抽象工厂模式小结

1、 生产抽象的产品,创建的产品是接口(Interface)
2、抽象工厂模式创建的产品是接口,抽象出来的。
3、上面的例子其实跟普通工厂模式例子没太大的差别,除了产品不同,实现的思想都是一样的,只是这里用了不同的工厂对应不同的产品。普通工厂模式也可以这样用。

抽象工厂模式优缺点

优点:
1.分离接口与实现,无需关系创建的细节
2.将一个系列的产品统一到一起创建
缺点:
1.规定了所有可能被创建的产品集合,产品族中扩展新的产品困难;
2.增加了系统的抽象性和理解难度,抽象工厂模式在切换产品类的时候更加灵活容易

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值