工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类时哪一个,工厂方法让类把实例化推迟到子类。
工厂方法模式能够封装具体类型的实例化。
将创建对象的代码集中在一个对象或方法中,可以避免代码中的重复,并且更方便以后的维护。这也意味着客户在实例化对象时,只会依赖于接口,而不是具体类。可以帮助我们针对接口编程。而不针对实现编程。让代码更具有弹性,可以应对未来的扩展。
加载配置文件:
package com.zsq.project;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class PropertiesRead {
private static Properties properties = new Properties();
static {
try {
try (InputStream is = PropertiesRead.class.getResourceAsStream("type.properties")) {
properties.load(is);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static Properties getProperties() {
return properties;
}
}
配置文件内容;
left=com.zsq.project.LeftHair
生成对象的实现方式如下:
package com.zsq.project;
/**
* 发型工厂
*/
public class HairFactory {
/**
* 根据类型来创建对象
*
* @param key
* @return
*/
public HairInterface getHair(String key) {
if ("left".equals(key)) {
return new LeftHair();
} else if ("right".equals(key)) {
return new RightHair();
}
return null;
}
public HairInterface getHairByClassKey(String key) {
try {
return (HairInterface) Class.forName(PropertiesRead.getProperties().getProperty(key)).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
public HairInterface getHairByClass(String className) {
try {
HairInterface hair = (HairInterface) Class.forName(className).newInstance();
return hair;
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
public HairInterface getHairByClass(Class<? extends HairInterface> clazz) {
try {
return clazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}
通用工厂类:
public class FactoryTest<T> {
public T getInstance(Class<? extends T> t) {
try {
return t.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}
工厂方式模式和抽象工厂模式对比:
①工厂模式一种极端情况的抽象工厂模式,而抽象工厂模式可以看成是工厂模式的推广
②工厂模式用来创建一个产品的等级架构,而抽象工厂模式是用来创建多个产品的等级架构
③工厂模式只有一个抽象产品类,而抽象工厂模式有多个抽象产品类
工厂模式的好处:
①系统可以在不修改具体工厂角色的情况下引进新的产品
②客户端不必关心对象如何创建,明确了职责
③更好的理解面向对象的原则,面向接口编程,而不要面向实现编程
工厂模式适用于哪些场景:
①一个系统应当不依赖于产品类实例被创立,组成,和表示的细节,这对于所有形态的工厂模式都是重要的
②这个系统的产品有至少一个的产品族
③同属于同一个产品族的产品是设计成在一起使用的,这一约束必须得在系统的设计中体现出来
④不同的产品以一系列的接口的面貌出现,从而使系统不依赖于接口实现的细节