最近在学习设计模式的路上越走越远...
今天主要记录记录一下学习的工厂模式。
工厂模式目前有三个分支,简单工厂模式,工厂方法模式和抽象工厂方法模式,其中,我主要学习的是抽象工厂方法模式,因为该方法是工厂模式中最高层的方法。简单工厂模式,工厂类根据传参不同得到不同的产品。工厂方法模式能够创建这个系列中的各种产品,比如,iphone的各种配件。而抽象工厂模式作为更高级的模式,它可以创建整个苹果公司各个产品流水线,比如,他可以创建生产iphone配件的工厂,可以创建生产ipad配件的工厂等等。那么,抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品等级结构,它能够创建这一个等级结构中的产品族;而抽象工厂模式则需要面对多个产品等级结构,也就是说,抽象工厂方法模式可以工厂方法模式中的工厂。
说不如做,看的再多不自己亲手做一做来的有效率,这便是我学习工厂模式之后的心得。
首先,模拟场景。创建宝马车,X6和5系的,那么首先的有一个抽象的汽车工厂,CarFactory,由它来生成X6和5系的工厂,一个汽车工厂生产出来的汽车至少得有个壳,发动机,变速箱啥的,所有就有了方法。创建CarFactory如下:
1 public interface CarFactory { 2 public CarFrame createCarFrame(); 3 public Engine createEngine(); 4 public Gearbox createGearbox(); 5 }
一个汽车的基本配件都出来了,那么所有的配件都应该有各自的接口,我们再分别创建Engine,Gearbox和CarFrame,Engine如下(Gearbox、CarFrame类似):
1 public interface Engine { 2 public void createEngine(); 3 4 }
然后我们的X6和5系的都应该有这些个接口吧,我们在分别创建他们各自的Engine,Gearbox和CarFrame,X6的Engine:
1 public class BwmXSixEngine implements Engine { 2 3 private String emissions; 4 5 public BwmXSixEngine(String emissions){ 6 7 this.emissions = emissions; 8 } 9 10 @Override 11 public void createEngine() { 12 System.out.println("this BWM XDrive engine,and emissions is "+ this.emissions); 13 } 14 }
5系的Engine:
1 public class BwmFiveSeriesEngine implements Engine { 2 3 private final String emissions; 4 5 public BwmFiveSeriesEngine(String emissions){ 6 this.emissions = emissions; 7 } 8 9 @Override 10 public void createEngine() { 11 System.out.println("this is BWMFiveSeriesEngine it‘s emissions of "+this.emissions); 12 } 13 }
现在,X6和5系就只差装箱,我们就来创建他们的工厂吧,5系:
1 public class BwmFiveSeriesFactory implements CarFactory{ 2 3 4 @Override 5 public CarFrame createCarFrame() { 6 return new BwmFiveSeriesCarFrame("中大型车", new int[]{5047,1860,1491},"4门5座三厢车"); 7 } 8 9 @Override 10 public Engine createEngine() { 11 return new BwmFiveSeriesEngine("2.0T"); 12 } 13 14 @Override 15 public Gearbox createGearbox() { 16 return new BwmFIveSeriesGearbox("8挡手自一体"); 17 } 18 }
X6:
1 public class BwmXSixFactory implements CarFactory { 2 @Override 3 public CarFrame createCarFrame() { 4 return new BwmXSixCarFrame("中大型SUV",new int[]{4929,1983,1709},"5门5座SUV"); 5 } 6 7 @Override 8 public Engine createEngine() { 9 return new BwmXSixEngine("3.0T"); 10 } 11 12 @Override 13 public Gearbox createGearbox() { 14 return new BwmXSixGearbox("8挡手自一体"); 15 } 16 }
程序写到这里也快结束了,我们自己在写一个汽车超市来生成这些对象就好了,希望你有一次愉快的购物经历,哈哈~
在抽象工厂模式的运用中,需要有一个总的抽象工厂,这个工厂制造可以生产具体东西的工厂类,比如,CarFactory和BwmXSixFactory之间的关系。然后就是接口的运用。接口对于高抽象层级的类有很大作用,站在高处便能规定对继承该接口的类的行为,但并不具体到每一个继承的类的行为。最后,工厂模式成功的隐藏了类的行为,满足迪米特法则,调用者根本不关心怎么实现的,只要一个接口可以调用便行。
自己在设计模式这一块还比较弱,以后还需多多学习。设计模式每一个都不是太难,重要的是各个击破之后,将他们拿捏在手中能够灵活的运用到实例的工作中。所有,重要的还是自己能力的提升,加油~
ps:文中若是有哪里理解不顺或是需要改进的地方,望指出~
原文:http://www.cnblogs.com/wfsovereign/p/4359760.html