[关闭]
@Tyhj 2018-08-01T07:16:36.000000Z 字数 1577 阅读 530

工厂模式

设计模式


简单工厂模式:

屏幕快照 2018-08-01 下午3.08.55.png-20.3kB

由一个工厂对象决定创建出哪一种产品的实例。

简单例子

一个计算机代工生产商,代工生产多种电脑

抽象产品类

  1. public abstract class Computer {
  2. /**
  3. * 产品的抽象方法
  4. */
  5. public abstract void start();
  6. }

具体产品类

  1. public class HpComputer extends Computer {
  2. @Override
  3. public void start() {
  4. Log.e("factory", "惠普计算机启动");
  5. }
  6. }
  7. public class LenovoComputer extends Computer {
  8. @Override
  9. public void start() {
  10. Log.e("factory", "联想计算机启动");
  11. }
  12. }

工厂类

  1. public class ComputerFactory {
  2. public static Computer createComputer(String type) {
  3. Computer computer = null;
  4. switch (type) {
  5. case "lenovo":
  6. computer = new LenovoComputer();
  7. break;
  8. case "hp":
  9. computer = new HpComputer();
  10. break;
  11. default:
  12. break;
  13. }
  14. return computer;
  15. }
  16. }

客户端调用工厂类:

  1. public class CreateComputer {
  2. public static void main(String args[]){
  3. ComputerFactory.createComputer("hp").start();
  4. }
  5. }

使用场景:

  • 工厂类负责创建的对象比较少
  • 客户端只需要知道传入工厂类的参数,而无需关心创建对像的逻辑

优点:用户根据参数获取对应的类实例,避免了直接实例化对象,降低耦合
缺点:可实例化的类型在编译期间被确定了,如果新增类型,需要修改工厂,违背了开闭原则
简单工厂需要知道所有要生成的类型,当子类过多的时候不适合使用

工厂方法模式

屏幕快照 2018-08-01 下午3.14.15.png-29.5kB
定义:定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。

工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品 1

创建抽象工厂:

  1. public abstract class ComputerFactory {
  2. public abstract <T extends Computer> T createComputer(Class<T> clz);
  3. }

具体工厂:

  1. public class GDComputerFactor extends ComputerFactory {
  2. @Override
  3. public <T extends Computer> T createComputer(Class<T> clz) {
  4. Computer computer=null;
  5. String classname=clz.getName();
  6. try {
  7. //通过反射来生产不同厂家的计算机
  8. computer= (Computer) Class.forName(classname).newInstance();
  9. }catch (Exception e){
  10. e.printStackTrace();
  11. }
  12. return (T) computer;
  13. }
  14. }
  1. Class cla=Class.forName("java.lang.String");//初始化
  2. Object obj=cla.newInstance();//实例化为object类
  3. String str=(String)obj;//向下转换回子类

如果需要新的计算机,只需要创建产品就好了,无需修改其他方法

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注