- 前文
网上工厂模式的代码很多了,今天在看了一些博文后,我发了一个问题,在项目中实际上运到到的地方很多,但是又感觉自己对这个有所欠缺,所以今晚在这里记录一下,希望大家可以一起交流一下,刚开始对博客怎么写也没有太在意,就是想利用碎片时间记录一下自己的一些感受和心得,希望可以跟大家一起交流。
工厂模式有三种,简单工厂,工厂方法和抽象工厂。
其中简单工厂和工厂方法很好理解,抽象工厂要绕一点。
工厂的作用就是生产,以前我们通过new对象出来,现在我们通过一个工厂生产我们想要的,底层也是new。我觉得你们肯定刚开始想的跟我一样,为啥不直接new还要搞个工厂,这就是太年轻了啊。
利用工厂模式可以降低程序的耦合性,为后期的维护修改提供了很大的便利。将实现类和创建对象一起管理,降低系统的耦合度。
简单工厂中工厂集聚了所有类的创建,对于高类聚是种破坏,但是简单工厂目的性很强,知道该创建什么。
工厂方法模式,又称多态性工厂模式。在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是负责创建具体的工厂,将具体创建的工作交给子类去做。该核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销。
我们来具体说一说抽象工厂模式。
抽象工厂就好像是一个产品的组合,简单地说是工厂的工厂,抽象工厂可以创建具体工厂,由具体工厂来产生具体产品。
由上图我们可以知道,抽象工厂不再生产,而是交给了具体的工厂。
public interface Engine{
void run()
}
public class EngineA implements Engine{
public void run(){
System.out.println("A转的快!");
}
}
public class EngineB implements Engine{
public void run(){
System.out.println("B转的慢!");
}
}
public interface Tyre {
void add()
}
public class TyreA implements Tyre{
public void add(){
System.out.println("A轮胎跑得快!");
}
}
public class TyreB implements Tyre{
public void add(){
System.out.println("B轮胎跑得慢!");
}
}
public interface CarFactory {
Engine createEngine();
Tyre createTyre();
}
public class BMWFactory implements CarFactory{
Engine createEngine(){
return new EngineA();
}
Tyre createTyre(){
return new TyreA();
}
}
public class AudiFactory implements CarFactory{
Engine createEngine(){
return new EngineB();
}
Tyre createTyre(){
return new TyreB();
}
}
抽象工厂模式封装了产品的创建,使得不需要知道具体是哪种产品,只需要知道是哪个工厂就行了,比如我们要一辆BWM,我们只要宝马工厂就行了,问具体每个类的实现我们不用去理会。
可以支持不同类型的产品,使得模式灵活性更强,可拓展性比较强。
可以非常方便的使用一族中间的不同类型的产品。
但是你们有没有发现,代码是不是太过于冗余了,而且每次增加一个产品,工厂都要改,所以抽象工厂适合扩展产品族,而不是产品。