Android知识点整理9:工厂模式

一、简单工厂模式(静态工厂模式)

简单工厂模式也叫静态工厂模式,就是工厂类一般使用静态方法,通过接收的参数的不同的对象的不同来返回不同的对象实例。

缺点每次扩展都需要修改在工厂类里也的判断

这个其实使用最多

package com.androidtv.pos;

/**
 * @author wuqiqi
 * date on 2020/9/9
 * describe TODO
 */
public class Test {
    public static void main(String[] args) {
        Phone huaWeiPhone = PhoneFactory.createPhone("HuaWeiPhone");
        Phone iphonePhone = PhoneFactory.createPhone("IphonePhone");
        huaWeiPhone.function();
        iphonePhone.function();
    }

    interface Phone{
        void function();
    }
    static class HuaWeiPhone implements Phone{

        @Override
        public void function() {
            System.out.println(this.getClass().getSimpleName()+"function");
        }
    }
    static class IphonePhone implements Phone{
        @Override
        public void function() {
            System.out.println(this.getClass().getSimpleName()+"function");
        }
    }

    static class PhoneFactory{
        public static Phone createPhone(String phoneName){
            if("HuaWeiPhone".equals(phoneName)){
                return new HuaWeiPhone();
            }else if("IphonePhone".equals(phoneName)){
                return new IphonePhone();
            }
            return null;
        }
    }
}

二、工厂方法模式

就是声明一个工厂接口,不同类型的产品生成自己的工厂类

 为了避免简单工厂模式的缺点,不完全满足OCP(开闭原则)

工厂方法模式和简单工厂模式最大的不同在于,简单工厂模式只有一个(对于一个项目或者一个独立模块而言)工厂类,而工厂方法模式有一组实现了相同接口的工厂类。

设计一个工厂的接口,你想要什么东西,就写个类继承于这个工厂,这样就不用修改什么,直接添加就行了。

package com.androidtv.pos;

/**
 * @author wuqiqi
 * date on 2020/9/9
 * describe TODO
 */
public class Test {
    public static void main(String[] args) {
        Phone huaWeiPhone = new HuaWeiFactory().getPhoneByFactory();
        Phone iphonePhone = new IphoneFactory().getPhoneByFactory();
        huaWeiPhone.function();
        iphonePhone.function();
    }

    interface Phone{
        void function();
    }
    static class HuaWeiPhone implements Phone{

        @Override
        public void function() {
            System.out.println(this.getClass().getSimpleName()+"function");
        }
    }
    static class IphonePhone implements Phone{
        @Override
        public void function() {
            System.out.println(this.getClass().getSimpleName()+"function");
        }
    }

    interface PhoneFactory{
        Phone getPhoneByFactory();
    }


    static class HuaWeiFactory implements PhoneFactory{

        @Override
        public  Phone getPhoneByFactory() {
            return new HuaWeiPhone();
        }
    }

    static class IphoneFactory implements PhoneFactory{

        @Override
        public  Phone getPhoneByFactory() {
            return new IphonePhone();
        }
    }
}

三、简单工厂模式 和 工厂方法模式对比

1、结构复杂度

  从这个角度比较,显然简单工厂模式要占优,简单工厂模式只需要一个工厂类,而工厂方法模式的工厂类随着产品类的个数增加而增加,这无疑会使类的个数越来越多,从而增加了结构的复杂程度。

2、代码复杂度

   代码复杂度和结构复杂度是一对矛盾,既然简单工厂模式在结构方面相对简洁,那么它在代码方面肯定是比工厂方法模式复杂的了。简单工厂模式的工厂类随着产品类的增加需要增加更多方法(或代码)。

 

3、客户端编程难度

   工厂方法模式虽然在工厂类结构中引入了接口从而满足了OCP,但是在客户端编码中需要对工厂类进行实例化。而简单工厂模式的工厂类是个静态类,在客户端无需实例化,这无疑是个吸引人的优点。

 

4、管理上的难度

   这是个关键的问题。

   我们先谈扩展。众所周知,工厂方法模式完全满足OCP,即它有非常良好的扩展性。那是否就说明了简单工厂模式就没有扩展性呢?答案是否定的,简单工厂模式同样具备良好的扩展性-----扩展的时候仅需要修改少量的代码(修改工厂类的代码)就可以满足扩展性的要求了。尽管这没有完全满足OCP,但我们不需要太拘泥于设计理论,要知道,sun提供的java官方工具包中也有很多没有满足OCP的例子啊。

   然后我们从维护性的角度分析下,假如某个具体产品类需要进行一定的修改,很可能需要修改对应的工厂类。当同时需要修改多个产品类的时候,对工厂类的修改会变得相当麻烦(对号入座已经是个问题了)。反而简单工厂没有这些问题,当多个产品类需要修改时,简单工厂模式仍然仅仅需要修改唯一的工厂类(无论怎样都能改到满足要求吧?大不了把这个类重写)。

5、总结

根据设计理论建议:工厂方法模式。但实际上,我们一般都用了简单工厂模式

四、抽象工厂模式 

提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

主要是从 产品族角度的扩展,又要生产 手机,又要生产平板

工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。

package com.androidtv.pos;

/**
 * @author wuqiqi
 * date on 2020/9/9
 * describe TODO
 */
public class Test {
    public static void main(String[] args) {
        HuaWeiFactory huaWeiFactory = new HuaWeiFactory();
        IphoneFactory iphoneFactory = new IphoneFactory();
        Phone huaWeiPhone = huaWeiFactory.getPhoneByFactory();
        Tablet huaWeiTablet = huaWeiFactory.getTabletByFactory();
        Phone iphonePhone = iphoneFactory.getPhoneByFactory();
        Tablet iphoneTablet = iphoneFactory.getTabletByFactory();
        huaWeiPhone.function();
        huaWeiTablet.function();
        iphonePhone.function();
        iphoneTablet.function();
    }

    interface Phone{
        void function();
    }
    static class HuaWeiPhone implements Phone{

        @Override
        public void function() {
            System.out.println(this.getClass().getSimpleName()+"function");
        }
    }
    static class IphonePhone implements Phone{
        @Override
        public void function() {
            System.out.println(this.getClass().getSimpleName()+"function");
        }
    }

    interface Tablet{
        void function();
    }
    static class HuaWeiTable implements Tablet{

        @Override
        public void function() {
            System.out.println(this.getClass().getSimpleName()+"function");
        }
    }
    static class IphoneTable implements Tablet{
        @Override
        public void function() {
            System.out.println(this.getClass().getSimpleName()+"function");
        }
    }

    interface PhoneFactory{
        Phone getPhoneByFactory();
        Tablet getTabletByFactory();
    }


    static class HuaWeiFactory implements PhoneFactory{

        @Override
        public  Phone getPhoneByFactory() {
            return new HuaWeiPhone();
        }

        @Override
        public Tablet getTabletByFactory() {
            return new HuaWeiTable();
        }
    }

    static class IphoneFactory implements PhoneFactory{

        @Override
        public  Phone getPhoneByFactory() {
            return new IphonePhone();
        }

        @Override
        public Tablet getTabletByFactory() {
            return new IphoneTable();
        }
    }
}

 

 

 五、工厂方法模式 和 抽象工厂模式对比

        抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。

        在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。

参考文章:https://www.cnblogs.com/laojiao/p/9574680.html 

                  https://www.cnblogs.com/carryjack/p/7709861.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值