您的位置:首页 > 其它

设计模式之工厂模式

2016-06-29 08:07 351 查看
前两篇博客阅读量不行,让自己反思是不是博客质量不行呢,文字功底不行呢?算了不管这些东西了,反正我写博客也是为了提高、总结自己,无其他!

今天这篇博客我想要来写一写设计模式里面的工厂模式,其实说到工厂模式大家应该不会陌生。的确,在笔者还是个菜鸟的时候,还不理解设计模式到底是用来干什么的时候,工厂模式的大名就已经入耳。那么工厂模式到底是用来干什么的呢?在代码层面应该怎样来写呢?下面就让笔者通过一个例子来加以说明。

假设在一个汽车工厂里面可以同时生产宝马、奔驰、奥迪,当然心情好的话,也是可以扩展业务生产些兰博基尼、玛莎拉蒂什么的。我们先别管这家神奇的工厂有没有这个生产实力,我们在这里只管它的业务范围。假设每辆汽车的出厂标准都是具有属性速度、颜色、型号,具有方法驾驶、刹车。下面就让我们通过代码来模拟一下这个场景,首先肯定需要申明一个接口Car,定义如下:

public interface Car{
int getColor();
float getSpeed();
String getModel();
void run();
void stop();
}


接下来我们肯定通过上面的接口来扩展出宝马、奔驰、奥迪等车型了,代码如下:

public class BMW implements Car {

@Override
public void run() {
System.out.println("宝马开始跑...");
}

@Override
public void stop() {
// TODO Auto-generated method stub
System.out.println("宝马刹车...");
}

@Override
public int getColor() {
// TODO Auto-generated method stub
return Color.red;
}

@Override
public float getSpeed() {
// TODO Auto-generated method stub
return 60;
}

@Override
public String getModel() {
return "BMW";
}

}


public class Benzimplements Car {

@Override
public void run() {
System.out.println("奔驰开始跑...");
}

@Override
public void stop() {
// TODO Auto-generated method stub
System.out.println("奔驰刹车...");
}

@Override
public int getColor() {
// TODO Auto-generated method stub
return Color.black;
}

@Override
public float getSpeed() {
// TODO Auto-generated method stub
return 70;
}

@Override
public String getModel() {
return "Benz";
}

}


public class Audi implements Car {

@Override
public void run() {
System.out.println("奥迪开始跑...");
}

@Override
public void stop() {
// TODO Auto-generated method stub
System.out.println("奥迪刹车...");
}

@Override
public int getColor() {
// TODO Auto-generated method stub
return Color.blue;
}

@Override
public float getSpeed() {
// TODO Auto-generated method stub
return 80;
}

@Override
public String getModel() {
return "Audi";
}

}


通过上面的代码我们就已经定义好了三种车型,接下来我们就应该考虑该如何进行生产了。有两种常做的办法:1.当我们需要哪个车型的时候,就直接new;2.就是通过工厂模式,进行生产;当然最优的方法肯定是工厂模式了,为什么?采用new的方法进行生产,肯定就违反了迪米特原则,整个代码体系里面就缺少一个高内聚性,每当我需要一个车型就得找到这个车型new。而工厂模式呢,可以很好的为我们解决这个弊端。下面就让我们来看看,工厂模式的代码,首先声明一个抽象的车型工厂:

public abstract class AbstractCarFactory {

public abstract <T extends Car> T createCar(Class<T> c);
}


然后实现一个真正的生产工厂,代码如下:

public class CarFactory extends AbstractCarFactory {

@Override
public <T extends Car> T createCar(Class<T> c) {
Car car=null;
try{
car=(T)Class.forName(c.getName()).newInstance();
}catch(Exception e){
System.out.println("汽车生成错误");
}
return (T)car;
}

}


最后我们就可以调用该工厂类进行车型的生产制造了,代码如下:

public static void main(String[] args) {
// TODO Auto-generated method stub

AbstractCarFactory carFactory=new CarFactory();
Car bmwCar= carFactory.createCar(BMW.class);
bmwCar.run();
bmwCar.stop();

Car benzCar=carFactory.createCar(Benz.class);
benzCar.run();
benzCar.stop();

Car audiCar=carFactory.createCar(Audi.class);
audiCar.run();
audiCar.stop();
}


通过上面的代码,可以发现生产新的车型将变得非常简单,我们只要扩展新的Car,然后在main方法里面传入对应的类名即可。通过应用工厂模式,可以很好的降低代码之间的耦合,同时也符合6大原则里面迪米特原则、依赖倒置原则。下面让我们来看看工厂模式的扩展:简单工厂模式,多个工厂模式,替代单例模式,延迟初始化。

简单工厂模式:就是上面的抽象工厂类去掉,同时将里面的创建类移到真正的工厂类里面;

多个工厂模式:就是将工厂类进行拆分,不同的工厂类只生产一种产品;

替代单例模式:应该很好理解了;

延迟初始化:当我们需要一个对象的时候,才会去调用工厂进行初始化;

好了,今天的博客就到这里了。如果有什么不对的地方欢迎大家拍砖,后续有时间我也会继续更新。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: