一、描述
创建型设计模式包括如下几个:简单工厂模式(Simple Factory)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、创建者模式(Builder)、原型模式(Prototype)、单例模式(Singleton)。
二、六种创建型设计模式的比较
简单工厂模式:简单工厂模式又叫静态工厂模式,它定义一个具体的工厂类来负责所有产品对象的创建,因此这个工厂类的职责过大,当客户端UI与某些产品的创建有不同的要求时,需要不断地修改工厂类,增加判断逻辑,不利于后期维;而且由于简单工厂模式使用静态方法来创建对象,这就导致静态方法不能被继承。
例如:我要创建奥利汽车的轮胎、发动机、底盘、车身,也要创建BYD汽车的轮胎、发动机、底盘、车身,那么在简单工厂模式下,我有一个工厂类要实现创建这六个部件的方法,也就是所有部件产品的创建都放在一个工厂类中。
简单工厂模式案例详情请见:http://blog.csdn.net/tongyuehong137/article/details/45399321
工厂方法模式:在简单工厂模式的基础上,不再是用一个工厂类创建所有产品的对象,而是一个具体的工厂类负责创建一个单独的产品,有几个不同的产品就需要几个不同的工厂类,即使这两个产品有某些联系,也需要分成不同的工厂类。在这个模式中,抽象工厂类负责定义创建对象的接口,而实现抽象工厂的具体工厂类负责具体对象的创建,随着产品数量的不断增加,具体工厂类的数量将会越来越多。
例如:我要创建奥利汽车的轮胎、发动机、底盘、车身,也要创建BYD汽车的轮胎、发动机、底盘、车身,那么在工厂方法模式下,我有一个四个抽象工厂类:轮胎、发动机、底盘、车身;有八个具体工厂类:奥迪轮胎工厂类、奥迪发动机工厂类、奥迪底盘工厂类、奥迪车身工厂类,BYD轮胎工厂类、BYD发动机工厂类、BYD底盘工厂类、BYD车身工厂类,随着不同品牌的汽车车牌的增加,我的具体工厂类也会越来越多。
工厂方法模式案例详情请见:http://blog.csdn.net/tongyuehong137/article/details/45399831
抽象工厂模式:在工厂方法模式的基础上,我们抛弃了一个产品对应一个具体工厂类的想法,而是由一个具体的工厂类负责创建一系列有相互关联的产品,当一系列相互关联的产品被设计到一个工厂类之后,客户端的调用就变得非常简单;如果要更换这个谢列的产品,则只需要更换一个工厂类即可。但是这个模式把相互关联的产品的组装放在了客户端,这会使客户端变得非常臃肿;如果把零件组装放在工厂类里面,由违反了工厂类“单一职责”的原则,使工厂类既要负责对象的创建,又要负责产品的组装。
例如:我要创建奥利汽车的轮胎、发动机、底盘、车身,也要创建BYD汽车的轮胎、发动机、底盘、车身,那么在抽象工厂模式下,我有一个抽象工厂类:这个工厂类定义了创建轮胎、发动机、底盘、车身四个接口,然后我有两个具体工厂类:奥迪汽车工厂类和BYD汽车工厂类,这个两个类实现了抽象工厂中的所有方法,可以创建四种产品。这大大减少了具体工厂类的数量,把有相互联系的四种产品放到一个类中加以联系,但是这个具体工厂类只负责创建四种产品,却不能将这四个产品组装起来,组装的工作需要客户端负责,使得客户端变得异常庞大。
抽象工厂模式案例详情请见:http://blog.csdn.net/tongyuehong137/article/details/45418163
创建者模式:创建者模式只是在抽象工厂模式上多加了组装类,这个组装类负责将一系列有相互关系的产品进行组装,这个组装类负责调用具体工厂类创建产品的方法,将产品创建并组装好,然后客户端直接调用这个组装类来生产一个整体的产品。
例如:我要创建奥利汽车的轮胎、发动机、底盘、车身,也要创建BYD汽车的轮胎、发动机、底盘、车身,那么在创建者模式下,我在有抽象工厂模式下的所有抽象类和具体类的同时,我多了一个组装类,这个组装类调用具体工厂类创建部件,并把部件进行组合最终将结果返回给客户端。
创建者模式案例详情请见:http://blog.csdn.net/tongyuehong137/article/details/45419489
原型模式:原型模式是通过一个原型对象来表明要创建对象的类型,然后使用复制这个原型对象的方法来创建更多同类型的对象,在原型模式中可以动态地添加产品类,而且对整体结构没有影响。
例如:我要创建一辆BYD的汽车,那么我可能在流水线上会有一道工序是组装车身,然后第二道工序是在第一道工序的基础上(一个车身原型)加上一个轮胎,然后第三道工序在第二道工序上增加发动机,以此类推,每一道工序完成后产生了一个原型,下一道工序是相当于拷贝了前一道工序的结果原型,并在这个基础上再加上部件。
原型模式模式案例详情请见:http://blog.csdn.net/tongyuehong137/article/details/45422425
单例模式:单例模式就是确保一个类只有一个实例,并且该实例是自动创建,并可以向整个系统提供该实例,客户端只能调用一个公共接口来产生一个实例,而且只能产生一次。
单例模式模式案例详情请见:http://blog.csdn.net/tongyuehong137/article/details/45438817