创建型模式是用来创建对象的,其中包含设计模式前奏说的共5个设计模式。简单工厂模式不属于23种设计模式,也不属于5种创建型模式,但它是创建型模式的基础,所以以创建型模式前奏为题说一下。
工厂模式我们经常见到,不管是数据库连接工厂还是服务器连接工厂或者其他,顾名思义,都是用来提供产品的。
简单工厂模式很容易理解,事物都是由简单一步步演化复杂的,就是我们编程最初始思想,就可以水到渠成写出简单工厂模式。
简单工厂模式UML类图如图所示:
手残党
上边两条线表示继承关系,下面两条线表示依赖关系。
实例代码如下:
抽象产品类
public abstract class Product {
//公共方法
public void sameMethod(){
System.out.println("我是公共方法!");
}
//定义抽象方法
public abstract void diffMethod();
}
具体产品A
public class ProductA extends Product{
@Override
public void diffMethod() {
System.out.println("A产品的方法!");
}
}
具体产品B:
public class ProductB extends Product{
@Override
public void diffMethod() {
// TODO Auto-generated method stub
System.out.println("B产品方法!");
}
}
工厂类
public class Factory {
public static Product getProduct(String productDesc){
if("A".equalsIgnoreCase(productDesc)){
return new ProductA();
}else if("B".equalsIgnoreCase(productDesc)){
return new ProductB();
}
return null;
}
}
说明:简单工厂模式创建实例的方法通常是静态方法,因此又被称为静态工厂模式,它是一种 类创建模式。
Main类
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Product product =Factory.getProduct(ReadProperties.readProperties("product_name"));
product.sameMethod();
product.diffMethod();
}
}
其中ReadProperties是一个辅助类,用来读取info.properties配置文件中关于产品的配置信息,根据该配置信息生产产品。
ReadProperties如下:
public class ReadProperties {
private static final Properties properties = new Properties();
private static final String INFO_FILE = "info.properties";
static{
InputStream in =null;
in = ReadProperties.class.getClassLoader().getResourceAsStream(INFO_FILE);
try {
properties.load(in);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/****
* 按照键值读取配置文件属性
* @param key
* @return
*/
public static String readProperties(String key){
return (String)properties.get(key);
}
}
简单工厂模式说明:
简单工厂方法模式思想很好理解,就是建一个工厂类,提供一个静态工厂方法,根据参数返回不同的具体产品。如果要修改产品,无需修改源代码,修改配置文件即可。
但简单工厂模式也有缺点;
工厂类职责过重,工厂类出问题,全玩儿完。
创建逻辑十分不灵活,要增加新产品,就要修改工厂源代码的创建逻辑,破坏对修改关闭原则(这个弊端就是因为没有面向高层面向抽象面向接口编程造成的,且看下一篇工厂方法模式如何解决这个问题)。
如有错误,欢迎指正
end