创建型模式 - 总结

1、 创建型模式总结

  创建型模式顾名思义就是与对象的创建有关的模式。这些模式会返回一个对象给你。创建型模式有简单工厂、工厂方法、抽象工厂、单例、建造者、原型。

1.1简单工厂方法

       简单工厂由工厂类、抽象产品类和具体产品类组成。

 

  简单工厂通过一个静态方法,根据方法参数以决定返回哪个具体产品。所以又叫静态工厂。

  代码是死的,人是活的,这里通过一个参数去决定返回的具体产品还是太不方便了,每增加一个具体产品就要修改if else 或者 swich。所以可以在工厂类中定义多个静态方法。每个静态方法返回一个具体产品。

1.2工厂方法

       工厂方法由抽象工厂类、具体工厂类、抽象产品类、具体产品类构成。

 

       在简单工厂中添加一个具体产品,需要修改工厂类,添加新的静态方法已返回新的具体产品或者修改if else。

       工厂方法通过抽象一个抽象工厂类,使具体产品的创建落到了具体工厂中。工厂方法中有多少个抽象产品就有多少个抽象工厂,抽象产品有多少个具体产品就有多少个具体工厂。

1.3抽象工厂

       抽象工厂由抽象工厂类、具体工厂类、抽象产品类、具体产品类构成。组成与工厂方法相同。但在抽象工厂中会有多个工厂方法,每个工厂方法返回一个抽象产品。

 

       当抽象产品之间有一定联系形成产品族时,使用工厂方法会导致具体工厂类过多。

  例如抽象工厂“电脑”,抽象产品“显卡”,抽象产品CPU。抽象“电脑”有两个具体工厂“低端电脑”和“高端电脑”。显卡和CPU都对应有“低端”和“高端”的具体产品。“低端“电脑具体工厂有两个“工厂方法“,分别返回“低端显卡“和“低端CPU“,返回类型为“显卡“和“CPU“。同理,“高端电脑“返回“高端显卡“和高端“CPU“。

  “低端显卡“和“低端CPU“组成一个低端的产品族。“高端显卡“和“高端CPU“组成高端产品族。抽象工厂这里就产生了3个接口和6个Java类。使用工厂方法则需要一个抽象“显卡“和抽象“CPU“,分别有两个低端和高端的具体工厂。则工厂方法4个接口和6个Java类。如果产品族中再加个抽象产品“硬盘“,则抽象工厂产生4个接口和8个Java类。工厂方法需要6个接口和8个Java类。

      

1.4建造者模式

       将一个产品的内部表象与产品的生成过程分割开来。从而使一个建造过程生成具有不同的内部表象的产品对象。

       建造者模式由抽象建造者类、具体建造者类、导演者类和产品类组成。

 

       抽象建造者类定义了产品类的各个部件的初始化方法。具体建造者类重写这些方法并完成相关初始化的过程。导演者类负责与客户端交互。通常导演者类包含与抽象建造者类相同的方法。导演者类持有一个类型为抽象建造者类的属性,通过构造方法传入具体的建造者类。导演者类的所有请求实际都是委派给了具体建造者类完成的。

1.4.1多产品建造者模式

       多产品建造者模式包含多个产品类。每个产品类对应一个具体建造者类。

   

1.4.2省略抽象建造者角色

       当只有一个具体建造者角色的话,可以省略抽象建造者角色。抽象建造者角色的目的是规范具体建造者角色的行为。当只有一个具体建造者角色的时候,抽象建造者角色就可以去掉了。导演类直接与具体建造者交互。

 

1.4.3省略导演者角色

       导演者类在初始化时会根据传入的具体建造者角色初始化抽象建造者类属性。而当抽象建造者角色省去时,只有一个具体的建造者类,此时的导演者类只是一个起到委派作用的转接类,这个导演者类就可以省略了。

 

1.5单例模式

       单例模式确保某一个类只有一个实例。而且自行实例化并向整个系统提供这个实例。单例模式分为懒汉式和饿汉式。饿汉式由于status机制天生线程安全。懒汉式因为延迟加载,初始化在返回对象的方法中。懒汉式可以使用synchronized或者静态内部类去实现。静态内部类会比synchronized效率高,不推荐使用双重锁校验的方式实现懒汉式单例。

1.6原型模式

通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的办法创建出更多的同类型的对象。

      

1.6.1浅复制

浅复制仅仅复制所考虑的对象,而不是复制它所引用的对象。

      对象是在堆中产生的,对象中的类变量的基础类型的值在这个对象本身的内存空间中,引用类型则在这个对象中存放一个引用地址或称为指针的东西,指向了另一个对象在内存中的位置。复制出来的对象中的引用类型变量指向了被复制对象的引用类型变量地址。

 

1.6.2深复制

    深复制是将被复制对象完全拷贝过来。在内存中形成一个新的,无任何引用关系的对象。

被复制对象的引用类型对象也会重新再内存中创建一个新对象。

 

猜你喜欢

转载自www.cnblogs.com/simple-ly/p/9900349.html