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项目
使用简单工厂创建每一个格子,不过是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();
以上就是简单工厂模式的使用和示例,可见简单工厂模式在日常开发中还是很常见的。如果你的程序满足简单工厂模式的应用场景,可以使用该模式来提高代码质量。
上面源码可以查看工程
下一篇:
二叉树遍历的C语言实现