简单工厂模式
简单工厂模式(Simple Factory)能够根据提供给它的数据,返回一个类的实例。
使用简单工厂模式可以在不需要了解类详细信息的情况下实例化对象。在子类比较固定不需要扩展时,可以使用简单工厂。
特点:每增加一个类,都需要修改工厂类的代码,在其中添加相应的case。
- 优点: 简单工厂实现了对象的创建和使用分离的功能 客户端无需知道所要创建的具体产品类的类名,只需要具体产品类对应的参数就可以创建出产品对象 在不修改任何客户端代码的情况下更换或增加新的具体产品类,在一定程度上提高了系统的灵活性
- 缺点: 工厂类的职责过重,工厂类中包含具体的逻辑判断语句,它一旦有问题,整个系统都会出问题 在添加新的类的时候,工厂类就要修改,这违反了开闭原则,不利于系统的扩展和维护 工厂类的静态方法,使得工厂角色无法形成基于继承的等级结构
- 产品接口
public interface Traffic {
void run();
void brake();
}
- 产品类
public class Audi implements Traffic {
@Override
public void run() {
System.out.println("audi run");
}
@Override
public void brake() {
System.out.println("audi brake");
}
}
public class Benz implements Traffic {
@Override
public void run() {
System.out.println("benz run");
}
@Override
public void brake() {
System.out.println("benz brake");
}
}
public class BMW implements Traffic {
@Override
public void run() {
System.out.println("bmw run");
}
@Override
public 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();
}