Android知识:从简单到抽象的工厂模式

        在软件开发中,设计模式是解决特定设计问题的最佳实践。工厂模式(Factory Pattern)是其中非常重要且广泛使用的一种创建型设计模式,旨在解决对象的创建问题,将对象的创建与使用分离,降低系统的耦合度,提高系统的可扩展性和可维护性。本文将深入探讨工厂模式的三种类型:简单工厂模式、工厂方法模式和抽象工厂模式,并通过详细的示例和UML图来说明每种模式的应用场景、优点及在Android或Java中的实际使用。

一、工厂模式概述

        工厂模式的核心在于定义一个用于创建对象的接口,但让子类决定要实例化的类是哪一个。工厂模式让类的实例化推迟到子类中进行,从而使系统具有更好的扩展性和灵活性。工厂模式主要用于创建复杂对象时隐藏实例化逻辑,并可通过一个共同的接口来访问新创建的对象。

二、简单工厂模式(Simple Factory)
2.1 定义

        简单工厂模式也称为静态工厂方法模式,它由一个工厂类根据传入的参数,动态地决定应该创建哪一个产品类(即类的实例)的实例。该工厂类含有必要的逻辑,用于根据接收到的信息返回对应类的实例。

2.2 优点
  1. 分离了实例化逻辑:客户端不需要知道具体产品的类名,只需要知道对应的参数。
  2. 减少了类的依赖:客户端只需要知道工厂类和使用的产品接口。
2.3 缺点
  1. 违背开闭原则:当需要增加新产品时,需要修改工厂类的判断逻辑,违背了开闭原则(软件实体应当对扩展开放,对修改关闭)。
  2. 不易于扩展和维护:随着产品种类的增加,工厂类的逻辑会变得越来越复杂。
2.4 示例

        在前面的示例中,我们定义了一个IMapView接口和BaiduMapView实现类,并通过MapViewFactory工厂类来创建IMapView的实例。这里稍作修改,以更清晰地展示简单工厂模式。

// IMapView 接口  
public interface IMapView {  
    void getView();  
    void setMapType(String mapType);  
}  
  
// BaiduMapView 实现类  
public class BaiduMapView implements IMapView {  
    @Override  
    public void getView() {  
        System.out.println("调用了百度地图的getView");  
    }  
  
    @Override  
    public void setMapType(String mapType) {  
        System.out.println("百度地图设置了类型:" + mapType);  
    }  
}  
  
// 工厂类  
public class MapViewFactory {  
    public static IMapView createMapView(String type) {  
        if ("Baidu".equals(type)) {  
            return new BaiduMapView();  
        }  
        // 可以添加更多产品的创建逻辑  
        return null;  
    }  
}  
  
// 客户端代码  
public class SimpleFactoryTest {  
    public static void main(String[] args) {  
        IMapView mapView = MapViewFactory.createMapView("Baidu");  
        mapView.getView();  
        mapView.setMapType("卫星图");  
    }  
}
2.5 Android中的应用

        在Android开发中,简单工厂模式的应用非常广泛,比如BitmapFactoryXmlPullParserFactory等。这些类通过提供静态方法来创建特定类型的对象,降低了客户端与具体实现类的耦合度。

三、工厂方法模式(Factory Method)
3.1 定义

        工厂方法模式将对象的创建延迟到子类中进行,通过定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类中进行。

3.2 优点
  1. 符合开闭原则:当需要增加新的产品时,只需添加新的具体产品类和对应的具体工厂类,原有系统代码无需修改。
  2. 提高了系统的扩展性和灵活性:每个具体工厂类只负责创建对应的产品,系统可以通过使用不同的具体工厂类来创建不同的产品对象。
3.3 缺点
  1. 增加了类的数量:每增加一个产品,都需要增加一个具体产品类和一个具体工厂类。
  2. 增加了系统的复杂度:系统中类的数量增多,系统的复杂度和维护成本也会相应增加。
3.4 示例

        在前面的示例基础上,我们可以将MapViewFactory改造为抽象工厂类,并通过不同的子类来实现不同的地图创建逻辑。

// 抽象工厂类  
public abstract class MapViewFactory {  
    public abstract IMapView createMapView();  
}  
  
// BaiduMapViewFactory 具体工厂类  
public class BaiduMapViewFactory extends MapViewFactory {  
    @Override  
    public IMapView createMapView() {  
        return new BaiduMapView();  
    }  
}  
  
// 客户端代码  
public class FactoryMethodTest {  
    public static void main(String[] args) {  
        MapViewFactory factory = new BaiduMapViewFactory();  
        IMapView mapView = factory.createMapView();  
        mapView.getView();  
        mapView.setMapType("卫星图");  
    }  
}
3.5 Java中的应用

在Java标准库中,ListSetMap等集合类就广泛使用了工厂方法模式。例如,List接口提供了ofcopyOf等静态方法,这些方法实际上是工厂方法,用于创建不可变的List实例。

四、抽象工厂模式(Abstract Factory)
4.1 定义

        抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。抽象工厂模式允许客户端使用抽象的接口来创建一组相关的产品,而不需要知道(或关心)实际产出的具体产品类是什么。

4.2 优点
  1. 封装性:客户端只需要关心产品的接口,而不需要知道具体的实现类。
  2. 扩展性:当增加新的产品族时,只需要增加新的具体工厂类和具体产品类,原有系统代码无需修改。
4.3 缺点
  1. 难以增加新的产品:如果需要在产品族中增加新的产品,则所有的工厂类都需要进行修改。
  2. 系统复杂度增加:系统中类的数量会大量增加,增加了系统的复杂度和维护成本。
4.4 示例

在前面的地图示例基础上,我们可以引入抽象工厂模式,支持创建不同类型的地图服务(如地图、导航、定位等)。

// 抽象工厂  
public abstract class MapServiceFactory {  
    public abstract MapService createMapService();  
    public abstract NavigationService createNavigationService();  
    public abstract LocationService createLocationService();  
}  
  
// 具体工厂:百度地图工厂  
public class BaiduMapServiceFactory extends MapServiceFactory {  
    @Override  
    public MapService createMapService() {  
        return new BaiduMapService();  
    }  
  
    @Override  
    public NavigationService createNavigationService() {  
        return new BaiduNavigationService();  
    }  
  
    @Override  
    public LocationService createLocationService() {  
        return new BaiduLocationService();  
    }  
}  
  
// 客户端代码  
public class AbstractFactoryTest {  
    public static void main(String[] args) {  
        MapServiceFactory factory = new BaiduMapServiceFactory();  
        MapService mapService = factory.createMapService();  
        NavigationService navigationService = factory.createNavigationService();  
        LocationService locationService = factory.createLocationService();  
          
        // 使用服务...  
    }  
}
4.5 Android中的应用

        在Android开发中,抽象工厂模式的应用相对较少,因为Android框架本身提供了大量的工具和类来简化开发。但在一些复杂的系统中,如需要同时支持多种类型的UI组件或服务时,可以考虑使用抽象工厂模式来管理这些组件或服务的创建。

五、总结与对比
  • 简单工厂模式:适用于产品种类较少且不会频繁增加的情况。它通过静态方法来创建对象,简单易用,但违背了开闭原则,扩展性较差。
  • 工厂方法模式:适用于产品种类较多且需要频繁扩展的情况。它将对象的创建延迟到子类中进行,符合开闭原则,提高了系统的扩展性和灵活性。
  • 抽象工厂模式:适用于需要创建一组相关或依赖对象的家族的情况。它提供了创建产品家族的接口,使得客户端在不知道具体产品类的情况下,能够创建一组相关的产品对象。但系统复杂度较高,难以增加新的产品。

在实际开发中,应根据具体需求和场景来选择合适的工厂模式。通过合理使用工厂模式,可以有效地降低系统的耦合度,提高系统的可扩展性和可维护性。

个人网站:www.rebootvip.com
更多SEO优化内容 网站学习 google adsense
资源免费分享下载:电子书,项目源码,项目实战
** ** Python 从入门到精通 ** ** 
** ** Java   从入门到精通 ** ** 
** ** Android从入门到精通 ** ** 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孔乙己大叔

你看我有机会吗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值