设计模式之工厂模式

关于设计模式的博客有很多,我这里仅仅是写下自己理解,简单工厂模式,工厂模式的一种形式,属于创建型模式,主要是用来创建对象的,引用别人的概述:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

应用实例:需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。

代码示例:步骤一:创建一个接口 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

到次,工厂模式就说这么多了,还需要自己在项目中理解,本人的理解也不是很透彻,仅此为了回顾,留下点资料罢了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值