设计模式之工厂方法模式

文章目录

  • 工厂方法模式
    • 1.定义
    • 2.特点
    • 3.示例代码
    • 4.扩展
    • 5.示例代码地址

工厂方法模式

1.定义

工厂方法模式使用的频率非常高,在我们日常的开发中总能见到它的身影。其定义为:

Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses.(定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。)

2.特点

  1. 良好的封装性,代码结构清晰
  2. 工厂方法模式的扩展性非常优秀。在增加产品类的情况下,只要适当地修改具体的工厂类或扩展一个工厂类,就可以完成“拥抱变化”。

3.示例代码

public abstract class Product {public void method1(){}public abstract void method2();
}
public class ConcreteProduct1 extends Product {public void method2() {}
}
public class ConcreteProduct2 extends Product {public void method2() {}
}
public abstract class Creator {public abstract <T extends Product> createProduct(Class<T> clazz);
}
public class ConcreteCreator extends Creator {public <T extends Product> createProduct(Class<T> clazz) {Product product = null;try {product = (Product)Class.forName(clazz.getName()).newInstance();} catch(Exeception e) {}return (T)product;}
}

4.扩展

  1. 简单工厂模式

    public class ObjectFactory<T> {private final static Map<String, IDao<?>> DAO_MAP = Maps.newHashMap();private static final String DEFAULT_PROPERTIES_FILE_NAME = "beans.properties";static {// 加载配置文件Properties properties = new Properties();try {properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream(DEFAULT_PROPERTIES_FILE_NAME));if (CollectionUtils.isEmpty(properties.keySet())) {throw new RuntimeException("properties is empty");}for (Object key : properties.keySet()) {Object o = properties.get(key.toString());Class<?> clazz = Class.forName(o.toString());DAO_MAP.put(key.toString(), (IDao<?>)clazz.newInstance());}} catch (Exception e) {throw new RuntimeException(e);}}public static IDao<?> getDaoByName(String name) {return DAO_MAP.getOrDefault(name, null);}
    }
    
    public class StudentDaoImpl implements IDao<Student> {@Overridepublic boolean save(Student o) {System.out.println("StudentDaoImpl.save");System.out.println(o);return true;}@Overridepublic int update(Student o) {System.out.println("StudentDaoImpl.update");return 0;}@Overridepublic boolean delete(Student o) {System.out.println("StudentDaoImpl.delete");return false;}@Overridepublic Student selectById(String id) {System.out.println("StudentDaoImpl.selectById");return null;}
    }
    public class TeacherDaoImpl implements IDao<Teacher> {@Overridepublic boolean save(Teacher o) {System.out.println("TeacherDaoImpl.save");return false;}@Overridepublic int update(Teacher o) {System.out.println("TeacherDaoImpl.update");return 0;}@Overridepublic boolean delete(Teacher o) {System.out.println("TeacherDaoImpl.delete");return false;}@Overridepublic Teacher selectById(String id) {System.out.println("TeacherDaoImpl.selectById");return null;}
    }
    

    bean.properties

    studentDao=com.yxxmg.gof.create.pattern.factory.impl.StudentDaoImpl
    teacherDao=com.yxxmg.gof.create.pattern.factory.impl.TeacherDaoImpl
    

5.示例代码地址

https://gitee.com/youxiaxiaomage/java-practices/tree/master/yxxmg-gof-sample/src/main/java/com/yxxmg/gof/create/pattern/abstractfactory