当前位置: 代码迷 >> 综合 >> 23种设计模式(2):工厂模式(Factory Pattern)
  详细解决方案

23种设计模式(2):工厂模式(Factory Pattern)

热度:59   发布时间:2023-10-15 07:55:27.0

本文通过配置文件的方式来配置新扩展的子类。需扩展子类时,新的子类只需实现超类Fruit接口,并且在fruit.properties配置文件中添加子类的映射即可,不需要修改工厂类;

一、将超类Fruit设计为接口;

/**
 * 水果超类
 */
public interface Fruit {
/**
* 水果生长
*/
public void grow();
/**
* 采摘水果
*/
public void pick();
}

二、所有的子类都实现超为接口Fruit;

/**
 * 香蕉子类
 */
public class Banana implements Fruit {
public Banana(){
System.out.println("生产香蕉...");
}
public void grow() {
System.out.println("香蕉正在生长...");
}
public void pick() {
System.out.println("采摘香蕉...");
}
}

/**
 * 苹果子类
 */
public class Apple implements Fruit {
public Apple(){
System.out.println("生产苹果....");
}
public void grow() {
System.out.println("苹果正在生长....");
}
public void pick() {
System.out.println("采摘苹果....");
}

/*子类特有的方法*/

public void applePai(){
System.out.println("apple特有的方法");
}
}

三、配置文件fruit.properties;

#code-->类名
#在扩展子类(只需继承Fruit超类)后,只在在fruit.properties中配置相应的子类完全限定名
apple=factory.demo2.Apple
banana=factory.demo2.Banana
pear=factory.demo2.Pear

四、工厂类

/**
 * 工厂类
 */
public class FruitFactory {
public static Fruit getInstance(String code) throws Exception{
Fruit fruit = null;
//读取配置子类配置文件
try {
String propertiesPath ="D:\\workspace\\23DesignPatterns\\src\\main\\java\\factory\\demo2\\fruit.properties";
InputStream is = new FileInputStream(new File(propertiesPath));
Properties properties = new Properties();
properties.load(is);
String className = properties.getProperty(code);
//通过反射方式加载子类,当扩展子类后,只需要修改fruit.properties配置文件即可
if(className != null){
fruit = (Fruit) Class.forName(className).newInstance();
}else {
throw new Exception("没有发现"+ code +"这个类型");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();

return fruit; 
}
}

五、测试类

/**
 * 测试类
 */
public class Test {
public static void main(String[] args) {
String code = "apple";
Fruit fruit;
try {
fruit = FruitFactory.getInstance(code);
if(fruit != null ){
fruit.grow();
fruit.pick();
}

if(fruit instanceof Apple){
((Apple) fruit).applePai();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

  相关解决方案