在Android开发中,工厂模式是一种创建型设计模式,它将对象的创建和使用分离,通过工厂类来负责创建对象。这种模式可以提高代码的可维护性和可扩展性,尤其适合复杂对象的创建过程。下面详细介绍工厂模式的类型、实现和典型应用场景。

一、工厂模式的三种类型

1. 简单工厂(Simple Factory)
  • 概念:一个工厂类根据传入的参数决定创建哪种产品类的实例。
  • 缺点:不符合开闭原则(新增产品需修改工厂类)。

示例代码

// 产品接口
interface Car {
    void drive();
}

// 具体产品
class Benz implements Car {
    @Override
    public void drive() {
        System.out.println("驾驶奔驰");
    }
}

class BMW implements Car {
    @Override
    public void drive() {
        System.out.println("驾驶宝马");
    }
}

// 简单工厂
class CarFactory {
    public static Car createCar(String type) {
        if ("Benz".equals(type)) {
            return new Benz();
        } else if ("BMW".equals(type)) {
            return new BMW();
        }
        return null;
    }
}

// 使用示例
Car benz = CarFactory.createCar("Benz");
benz.drive(); // 输出:驾驶奔驰
2. 工厂方法(Factory Method)
  • 概念:定义一个创建对象的接口,让子类决定实例化哪个类。
  • 优点:符合开闭原则,新增产品只需添加新的工厂子类。

示例代码

// 工厂接口
interface CarFactory {
    Car createCar();
}

// 具体工厂
class BenzFactory implements CarFactory {
    @Override
    public Car createCar() {
        return new Benz();
    }
}

class BMWFactory implements CarFactory {
    @Override
    public Car createCar() {
        return new BMW();
    }
}

// 使用示例
CarFactory factory = new BenzFactory();
Car benz = factory.createCar();
benz.drive(); // 输出:驾驶奔驰
3. 抽象工厂(Abstract Factory)
  • 概念:提供一个创建一系列相关或相互依赖对象的接口,无需指定具体类。
  • 适用场景:创建多个产品族的对象(如不同操作系统的UI组件)。

示例代码

// 抽象产品接口
interface Button {
    void click();
}

interface Checkbox {
    void check();
}

// 具体产品(Android风格)
class AndroidButton implements Button {
    @Override
    public void click() {
        System.out.println("Android按钮点击");
    }
}

class AndroidCheckbox implements Checkbox {
    @Override
    public void check() {
        System.out.println("Android复选框勾选");
    }
}

// 抽象工厂
interface UIFactory {
    Button createButton();
    Checkbox createCheckbox();
}

// 具体工厂(Android工厂)
class AndroidUIFactory implements UIFactory {
    @Override
    public Button createButton() {
        return new AndroidButton();
    }

    @Override
    public Checkbox createCheckbox() {
        return new AndroidCheckbox();
    }
}

// 使用示例
UIFactory factory = new AndroidUIFactory();
Button button = factory.createButton();
button.click(); // 输出:Android按钮点击

二、工厂模式在Android中的典型应用场景

1. View创建(简单工厂)
  • 场景:根据不同条件创建不同类型的View。
  • 示例
    public class ViewFactory {
        public static View createView(Context context, int type) {
            switch (type) {
                case TYPE_BUTTON:
                    return new Button(context);
                case TYPE_TEXT:
                    return new TextView(context);
                default:
                    return new View(context);
            }
        }
    }
    
2. 数据库操作(工厂方法)
  • 场景:根据不同数据库类型(SQLite、Room、Firebase)创建数据访问对象。
  • 示例
    interface DatabaseFactory {
        UserDao createUserDao();
        PostDao createPostDao();
    }
    
    class RoomDatabaseFactory implements DatabaseFactory {
        @Override
        public UserDao createUserDao() {
            return Room.databaseBuilder(context, AppDatabase.class, "app-db")
                    .build()
                    .userDao();
        }
    
        @Override
        public PostDao createPostDao() {
            return Room.databaseBuilder(context, AppDatabase.class, "app-db")
                    .build()
                    .postDao();
        }
    }
    
3. 多主题应用(抽象工厂)
  • 场景:根据不同主题(如Light/Dark模式)创建UI组件。
  • 示例
    interface ThemeFactory {
        Button createButton();
        TextView createTextView();
    }
    
    class LightThemeFactory implements ThemeFactory {
        @Override
        public Button createButton() {
            Button btn = new Button(context);
            btn.setBackgroundColor(Color.WHITE);
            return btn;
        }
    
        @Override
        public TextView createTextView() {
            TextView tv = new TextView(context);
            tv.setTextColor(Color.BLACK);
            return tv;
        }
    }
    
4. 第三方库初始化(简单工厂)
  • 场景:统一管理第三方库的初始化配置。
  • 示例
    public class LoggerFactory {
        public static Logger createLogger(String type) {
            switch (type) {
                case "debug":
                    return new DebugLogger();
                case "release":
                    return new ReleaseLogger();
                default:
                    return new DefaultLogger();
            }
        }
    }
    

三、工厂模式的优缺点

优点

  • 解耦创建和使用:客户端只需关注接口,无需关心对象创建细节。
  • 可维护性:对象创建逻辑集中在工厂类,便于修改。
  • 扩展性:工厂方法和抽象工厂模式符合开闭原则,易于添加新产品。

缺点

  • 类膨胀:工厂子类过多会导致代码复杂度增加。
  • 选择困难:需根据场景选择合适的工厂模式(简单工厂/工厂方法/抽象工厂)。

四、工厂模式与其他模式的结合

  1. 工厂模式 + 单例模式:工厂类可以是单例,确保全局只有一个工厂实例。
  2. 工厂模式 + 策略模式:工厂创建的对象可以是策略接口的实现类,动态切换策略。
  3. 工厂模式 + 建造者模式:对于复杂对象,工厂可以委托建造者模式来创建。

五、总结

工厂模式是Android开发中最常用的设计模式之一,适用于以下场景:

  • 对象创建过程复杂,需要封装细节。
  • 根据不同条件创建不同类型的对象。
  • 系统需要独立于产品的创建、组合和表示。

通过合理使用工厂模式,可以提高代码的可维护性、可扩展性和可测试性。在实际开发中,需根据对象复杂度和变化频率选择合适的工厂模式实现。

更多推荐