简单工厂模式:仅有一个工厂,根据所需产品描述(入参),生产所需产品。隐藏了对象创建的细节,将产品的实例化过程放到了工厂中实现。遵循了依赖倒置原则
。简单工厂模式
不属于 23 种设计模式之一;工厂方法模式
、抽象工厂模式
方属于 23 种设计模式。
示例:
// 定义一个产品接口
public interface Product{
// 输出产品类型
void printType();
}
// 定义具体的 西装类
public class Suit implements Product{
public void printType(){
System.out.println("西装");
}
}
// 定义具体的 T恤类
public class TShirt implements Product{
public void printType(){
System.out.println("T恤");
}
}
// 工厂类:根据入参返回所需的操作实例(将西装、T恤等产品输出)
public class SimpleFactory{
public static Product getProduct(int type){
Product product = null;
switch(type){
// 相当于工厂制造 西装 的产品线
case 1:
product = new Suit();
break;
// 相当于工厂制造 T恤 的产品线
case 2:
product = new TShirt();
break;
}
return product;
}
}
// 测试
public class Test{
public static void main(String[] args){
Product product1 = SimpleFactory.getProduct(1);
product1.printType(); // 西装
Product product2 = SimpleFactory.getProduct(2);
product2.printType(); // T 恤
}
}
缺点:工厂类集中了所有产品创建逻辑。若要新增产品,譬如运动服,则需修改 SimpleFactory
工厂类,添加相应 case
逻辑。这违反了 开闭原则
。
改进:使用反射
,避免修改工厂类(仅适用于工厂类没有较复杂的逻辑)。修改如下:
// 操作工厂类:根据传入的操作类Class 类型,返回对应操作类
public class SimpleFactory{
public static Product getProduct(Class clz){
Product product = null;
try{
product = (Product)clz.newInstance();
}catch(Exception ex){
ex.printStackTrace();
}
return product;
}
}
// 测试
public class Test{
public static void main(String[] args){
Product product1 = SimpleFactory.getProduct(Suit.class);
product1.printType(); // 西装
Product product2 = SimpleFactory.getProduct(TShirt.class);
product2.printType(); // T 恤
}
}