文章目录
- 工厂方法模式
- 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.特点
- 良好的封装性,代码结构清晰
- 工厂方法模式的扩展性非常优秀。在增加产品类的情况下,只要适当地修改具体的工厂类或扩展一个工厂类,就可以完成“拥抱变化”。
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.扩展
-
简单工厂模式
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.propertiesstudentDao=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