简单工厂设计模式

简单工厂模式

简单工厂模式(Simple Factory)能够根据提供给它的数据,返回一个类的实例。

使用简单工厂模式可以在不需要了解类详细信息的情况下实例化对象。在子类比较固定不需要扩展时,可以使用简单工厂。

特点:每增加一个类,都需要修改工厂类的代码,在其中添加相应的case。

  • 优点:
    简单工厂实现了对象的创建和使用分离的功能
    客户端无需知道所要创建的具体产品类的类名,只需要具体产品类对应的参数就可以创建出产品对象
    在不修改任何客户端代码的情况下更换或增加新的具体产品类,在一定程度上提高了系统的灵活性
  • 缺点:
    工厂类的职责过重,工厂类中包含具体的逻辑判断语句,它一旦有问题,整个系统都会出问题
    在添加新的类的时候,工厂类就要修改,这违反了开闭原则,不利于系统的扩展和维护
    工厂类的静态方法,使得工厂角色无法形成基于继承的等级结构

示例:

基本实现

  • 产品接口
public interface Traffic {void run();void brake();
}
  • 产品类
public class Audi implements Traffic {@Overridepublic void run() {System.out.println("audi run");}@Overridepublic void brake() {System.out.println("audi brake");}
}
public class Benz implements Traffic {@Overridepublic void run() {System.out.println("benz run");}@Overridepublic void brake() {System.out.println("benz brake");}
}
public class BMW implements Traffic {@Overridepublic void run() {System.out.println("bmw run");}@Overridepublic void brake() {System.out.println("bmw brake");}
}
  • 工厂类:
public class TrafficFactory {public static Traffic create(String type) { //type指的是用记要生产的车型的名称type = type.toLowerCase();//转换为小写switch (type) {case "audi":return new Audi();case "benz":return new Benz();case "bmw":return new BMW();default:return null;}}
}
  • 测试方法:
public static void main(String[] args) {String type= "Audi";Traffic traffic = TrafficFactory.create(type);traffic.run();traffic.brake();
}

改进一

  • 其它代码不变,修改工厂类代码如下:
public class TrafficFactory {public static Traffic create(String type){ //类名Traffic res = null;String className = "com.hc.product."+type; // 假设所有的产品类全部放在com.hc.product包中try {res = (Traffic) Class.forName(className).getDeclaredConstructor().newInstance();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}return  res;}
}
  • 测试代码
public static void main(String[] args) {String type= null;// type= "Audi";type="Benz";Traffic traffic = TrafficFactory.create(type);traffic.run();traffic.brake();
}

改进二

  • 其它代码不变,修改工厂类代码如下:
public class TrafficFactoryPlus {private TrafficFactoryPlus(){}public static Traffic create(Class clazz)  {Object traffic = null;try {traffic = clazz.getDeclaredConstructor().newInstance();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();}if(!(traffic instanceof  Traffic)){throw  new RuntimeException("类型不正确");}return (Traffic) traffic;}public static void main(String[] args) {Object s = "8";boolean b =  s instanceof  String;System.out.println(b);System.out.println("end");}
}
  • 测试代码
public static void main(String[] args) {Traffic traffic = null;traffic = TrafficFactoryPlus.create(String.class);traffic.run();traffic.brake();
}

本文链接:https://my.lmcjl.com/post/8639.html

展开阅读全文

4 评论

留下您的评论.