Java实现简单工厂模式

什么是简单工厂模式

定义一个工厂类,该类提供一个静态方法,该方法会根据传入的参数的不同来创建不同的实例。

特点和优点:

  • 工厂类中创建实例的方法是静态的,所以简单工厂模式也叫静态工厂模式
  • 根据传入参数的不同来获取不同的实例,不关注内部实现。

缺点:

  • 新增或修改创建过程需要修改静态方法内部逻辑,违背开闭原则;
  • 工厂类集成了创建实例的所有逻辑,职责过重,异常后会影响整个模块,另外内部逻辑过于复杂,扩展性差;
  • 工厂类使用静态方法,造成工厂角色无法被继承。

下面以车厂造车模型来实现简单工厂模式。

创建抽象类

简单工厂模式中会有一个抽象类,其他实例需要继承该类,来保证静态方法创建的实例是同一类型。

public abstract class Car {
    public abstract void run();
}

创建宝马车子类

public class BMWCar extends Car {

    private String name;

    public BMWCar(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        System.out.println(this.name);
    }
}

创建玛莎拉蒂车子类

public class MaseratiCar extends Car {

    private String name;

    public MaseratiCar(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        System.out.println(this.name);
    }
}

创建车工厂类

public class CarFactory {

    public static Car createCar(String brand) {
        Car car = null;
        switch (brand) {
            case "maserati": // 玛莎拉蒂
                car = new MaseratiCar(brand);
                break;
            case "bmw": // 宝马
                car = new BMWCar(brand);
                break;
        }
        return car;
    }
}

测试

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 创造宝马车
        Car car1 = CarFactory.createCar("bmw");
        car1.run();
        // 创造玛莎拉蒂车
        Car car2 = CarFactory.createCar("maserati");
        car2.run();
    }

}

结果:

System.out: bmw
System.out: maserati

开源库示例

1、log4j中使用简单工厂模式

// 使用
Log logger = LogFactory.getLog(KeyboardController.class);

// 静态工厂方法
public static Log getLog(Class clazz) throws LogConfigurationException {
    return getFactory().getInstance(clazz);
}

// 根据类名创建实例
public Log getInstance(Class clazz) throws LogConfigurationException {
    return getInstance(clazz.getName());
}

// 根据类名创建
public Log getInstance(String name) throws LogConfigurationException {
    Log instance = (Log) instances.get(name);
    if (instance == null) {
        instance = newInstance(name);
        instances.put(name, instance);
    }
    return instance;
}

2、PatternLocker项目

github上九宫格组件

使用简单工厂创建每一个格子,不过是kotlin代码:

object CellFactory {

    fun buildCells(width: Int, height: Int): List<CellBean> {
        val result = ArrayList<CellBean>()
        val pWidth = width / 8f
        val pHeight = height / 8f

        for (i in 0..8) {
            result.add(CellBean(i,
                    i % 3,
                    i / 3,
                    (i % 3 * 3 + 1) * pWidth,
                    (i / 3 * 3 + 1) * pHeight,
                    pWidth))
        }

        Logger.d("CellFactory", "result = $result")

        return result
    }
}

3、Android中BitmapFactory

BitmapFactory.Options decodeOptions = new BitmapFactory.Options();

以上就是简单工厂模式的使用和示例,可见简单工厂模式在日常开发中还是很常见的。如果你的程序满足简单工厂模式的应用场景,可以使用该模式来提高代码质量。

上面源码可以查看工程34-android-factory

个人公众号,喜欢的可以关注一下:
Java实现简单工厂模式_第1张图片

你可能感兴趣的:(Java设计模式,java,简单工厂模式)