关于设计模式的博客有很多,我这里仅仅是写下自己理解,简单工厂模式,工厂模式的一种形式,属于创建型模式,主要是用来创建对象的,引用别人的概述:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
应用实例:需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。
代码示例:步骤一:创建一个接口 Car.java
public interface Car {
public void run();
}
步骤二:创建实现接口的实体类
//宝马车
public class BMW implements Car {
@Override
public void run() {
System.out.println("BMW is running");
}
}
//大众车
public class DaZhong implements Car {
@Override
public void run() {
System.out.println("DaZhong is running");
}
}
//现代车
public class XianDai implements Car {
@Override
public void run() {
System.out.println("XianDai is running");
}
}
步骤三:创建一个工厂,生成基于给定信息的实体类的对象
public class CarFactory {
public Car getCar(String type){
if(type.equals("BMW")){
return new BMW();
}else if(type.equals("XianDai")){
return new XianDai();
}else if(type.equals("DaZhong")){
return new DaZhong();
}else{
return null;
}
}
}
步骤四:使用该工厂,通过传递类型信息来获取实体类的对象
public static void main(String[] args) {
CarFactory carFactory = new CarFactory();
Car dz = carFactory.getCar("DaZhong");
dz.run();
}
输出:DaZhong is running
这个设计模式的缺点,估计大家也都看出来了,若要新增一种车型,那就要新增一个实现类,关键是要动工厂类的代码,这就很恶心了,所以这种模式适合在任何需要生成复杂对象的地方使用,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式,如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
所以在简单工厂模式基础上可以继续改进,多个工厂方法模式
public class Car2Factory {
public Car getBMW(){
return new BMW();
}
public Car getXianDai(){
return new XianDai();
}
public Car getDaZhong(){
return new DaZhong();
}
}
调用示例:
Car2Factory car2Factory = new Car2Factory();
Car bmw = car2Factory.getBMW();
bmw.run();
输出;BMW is running
使用这种模式,需要new工厂类,这就引申出了 静态工厂方法模式,代码示例如下:
public class Car3Factory {
public static Car getBMW(){
return new BMW();
}
public static Car getXianDai(){
return new XianDai();
}
public static Car getDaZhong(){
return new DaZhong();
}
}
调用示例:
Car xianDai = Car3Factory.getXianDai();
xianDai.run();
输出:XianDai is running
以上三种形式在实际的开发过程中,都会不约而同的要多工厂类进行改动,我们使用反射机制可以解决每次增加一个产品时,都需要增加一个对象实现工厂的缺点。
代码示例:
public class Car4Factory {
public Object getCar(Class<?extends Car> clazz){
Object obj = null;
try {
obj = Class.forName(clazz.getName()).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return obj;
}
}
调用示例:
Car4Factory car4Factory = new Car4Factory();
BMW car = (BMW)car4Factory.getCar(BMW.class);//此处强转
car.run();
输出:BMW is running
到次,工厂模式就说这么多了,还需要自己在项目中理解,本人的理解也不是很透彻,仅此为了回顾,留下点资料罢了。