定义一个工厂类,该类提供一个静态方法,该方法会根据传入的参数的不同来创建不同的实例。
特点和优点:
缺点:
下面以车厂造车模型来实现简单工厂模式。
简单工厂模式中会有一个抽象类,其他实例需要继承该类,来保证静态方法创建的实例是同一类型。
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