最近在学习设计模式的路上越走越远...设计模式
今天主要记录记录一下学习的工厂模式。iphone
一、由来 ide
当咱们建立一个对象,而这个对象的建立过程序纷繁复杂,可能致使大量的重复代码的时候,工厂模式出现了。工厂方法模式经过定义一个单独的建立对象的方法来解决这些问题。由子类实现这个方法来建立具体类型的对象。也就是说,在咱们的实际运用中,工厂就是一个用来建立其余对象的对象。学习
二、实质this
定义一个建立对象的接口,但让实现这个接口的类来决定实例化哪一个类。工厂方法让类的实例化推迟到子类中进行。spa
三、现状介绍设计
工厂模式目前有三个分支,简单工厂模式,工厂方法模式和抽象工厂方法模式,其中,我主要学习的是抽象工厂方法模式,由于该方法是工厂模式中最高层的方法。简单工厂模式,工厂类根据传参不一样获得不一样的产品。工厂方法模式可以建立这个系列中的各类产品,好比,iphone的各类配件。而抽象工厂模式做为更高级的模式,它能够建立整个苹果公司各个产品流水线,好比,他能够建立生产iphone配件的工厂,能够建立生产ipad配件的工厂等等。那么,抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品等级结构,它可以建立这一个等级结构中的产品族;而抽象工厂模式则须要面对多个产品等级结构,也就是说,抽象工厂方法模式能够工厂方法模式中的工厂。code
四、三分支的关系对象
简单工厂模式一般伴随着对象的具体类型与工厂具体类型的一一对应,客户端代码根据须要选择合适的具体类型工厂使用。当这个选择包含复杂的逻辑时,就能够建立一个单一的工厂类,用以包含这种选择逻辑,根据参数的不一样选择实现不一样的具体对象。这个工厂类不须要由每一个具体产品实现一个本身的具体的工厂类,因此能够将工厂方法设置为静态方法,这就有了工厂方法模式。而抽象工厂方法模式即是封装着这样一组有着共同主题的工厂方法模式中的工厂。blog
一、简单工厂模式
当咱们的主程序中须要本身手动初始化一个对象,可是咱们并不想关注具体的初始化过程,这个时候简单工厂模式就是您的选择。
二、工厂方法模式
当你以为传入参数的这种简单的工厂模式让你程序容易出错,而且程序中的if-else让你的程序看起来有些臃肿,这个时候工厂方法模式就是您的选择。
三、抽象工厂方法模式
当你工厂类须要修改时,而在工厂方法模式中须要修改原有的工厂类,这就违背了设计原则中的OCP(开放闭合原则),这个时候,抽象工厂方法模式就是您的选择。
说不如作,看的再多不本身亲手作一作来的有效率,这即是我学习工厂模式以后的心得。
首先,模拟场景。建立宝马车,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:文中如果有哪里理解不顺或是须要改进的地方,望指出~