美文网首页
创建型设计模式

创建型设计模式

作者: engineer_tang | 来源:发表于2020-07-21 19:42 被阅读0次

1. 简介

主要关注点是“怎样创建对象?”,通过工厂创建对象,达到对象的创建和使用进行分离,降低系统耦合度。
创建型设计模式包括:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

(1) 单例模式
说明:为了节省内存资源、保证数据内容的一致性,对某些类要求只能创建一个实例,且该类能自行创建这个实例的一种模式。

  1. 懒汉式单例实现
package com.threadtest.designpattern;

public class LazySingleton {

    private static LazySingleton instance = null;

    private LazySingleton(){
    }

    public static LazySingleton getInstance() {
        if(instance == null) {
            synchronized (LazySingleton.class) {
                if(instance == null) {
                    instance = new LazySingleton();
                }
            }
        }
        return instance;
    }

}

  1. 饿汉式单例实现
package com.threadtest.designpattern;

public class HungrySingleton {

    private static HungrySingleton instance = new HungrySingleton();
    
    private HungrySingleton(){}

    public static HungrySingleton getInstance() {
        return instance;
    }
}

(2) 原型模式
说明:通过简单、高效的方式创建对象。
1 ) 浅克隆
含义:实现 Cloneable 接口就可实现对象的浅克隆,不能对引用类型对象进行单独复制。

package com.threadtest.designpattern;

public class Realizetype implements Cloneable {

    private String name;

    public Realizetype(String name) {
        this.name = name;
    }

    @Override
    public Realizetype clone() {
        try {
            return (Realizetype) super.clone();
        } catch (CloneNotSupportedException e) {
            return null;
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

2 )深克隆
含义:通过序列化(Serialization)等方式来进行深度克隆。

package com.threadtest.designpattern;

import java.io.*;

public class DeepClonetype implements Serializable {

    private String name;

    public DeepClonetype(String name) {
        this.name = name;
    }

    public DeepClonetype deepClone() throws Exception {
        //将对象写入流中,
        ByteArrayOutputStream bao = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bao);
        oos.writeObject(this);
        //将对象取出来
        ByteArrayInputStream bi = new ByteArrayInputStream(bao.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bi);
        return (DeepClonetype)ois.readObject();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

(3) 工厂方法模式
说明:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。
优点:
用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程
在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则
缺点:
每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。

1 ) 产品接口代码

package com.threadtest.designpattern;

public interface Product {

    void work();
}

2 ) 产品A代码

package com.threadtest.designpattern;

public class ProductA implements Product {

    @Override
    public void work() {
        System.out.println("产品A进行工作!");
    }
}

3 ) 产品B代码

package com.threadtest.designpattern;

public class ProductB implements Product {

    @Override
    public void work() {
        System.out.println("产品B开始工作!");
    }
}

4 ) 抽象工厂代码

package com.threadtest.designpattern;

public interface ProductFactory {

    Product produce();
}

5 )产品A工厂代码

package com.threadtest.designpattern;

public class ProductAFactory implements ProductFactory {

    @Override
    public Product produce() {
        return new ProductA();
    }
}

6 ) 产品B工厂代码

package com.threadtest.designpattern;

public class ProductBFactory implements ProductFactory {

    @Override
    public Product produce() {
        return new ProductB();
    }
}

7 ) 工厂执行代码

package com.threadtest.designpattern;

public class FactoryTest {

    public static void main(String[] args) {
        ProductFactory productFactory = new ProductAFactory();
        Product productA = productFactory.produce();
        productA.work();
        productFactory = new ProductBFactory();
        Product productB = productFactory.produce();
        productB.work();
    }
}

(4) 抽象工厂模式
说明:为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
满足条件:
系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
系统一次只可能消费其中某一族产品,即同族的产品一起使用。
优点
可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
当增加一个新的产品族时不需要修改原代码,满足开闭原则。
缺点
当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。
(5) 建造者模式
说明:将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示
优点:
各个具体的建造者相互独立,有利于系统的扩展。
客户端不必知道产品内部组成的细节,便于控制细节风险。

缺点:
产品的组成部分必须相同,这限制了其使用范围。
如果产品的内部变化复杂,该模式会增加很多的建造者类。

参考:http://c.biancheng.net/view/1348.html

相关文章

  • 23种设计模式总结一

    23 种经典设计模式共分为 3 种类型,分别是创建型、结构型和行为型。 一、创建型设计模式 创建型设计模式包括:单...

  • 创建型设计模式总结

    创建型设计模式总结 Intro 前面几篇文章已经把创建型设计模式都介绍了,来做一个简单的总结。 创建型设计模式,就...

  • 建造者设计模式-Builder design pattern

    建造者设计模式是创建型设计模式的一种。创建型设计模式处理对象创建的问题。 建造者设计模式,用来构建需要经过若干个建...

  • 设计模式归纳

    一、设计模式的分类 23 种经典的设计模式分为三类:创建型、结构型、行为型。 1.创建型设计模式主要解决“对象的创...

  • 设计模式--分类

    一、设计模式的分类设计模式可以概括为23种,按照特点可以将其分为三大类型:创建型、结构型、行为型。1、创建型创建型...

  • 单例模式

    单例 单例模式,是一种设计模式,属于创建型设计模式,还有一种创建型设计模式,工厂模式。设计模式总共有23种,三大类...

  • 《设计模式之美》- 23种设计模式

    学习《设计模式之美》笔记。 23 种经典设计模式共分为 3 种类型,分别是创建型、结构型和行为型 创建型模式 创建...

  • 设计模式简单总结(待完善)

    设计模式简单总结 设计模式可以分为:创建型,结构型,行为型三种模式。 1 创建型模式 1.1 单例模式 用来指定某...

  • 开发之设计模式-单例模式

    设计模式 设计模式分为三大类:创建型、结构型、行为型在Java中有24中设计模式 创建型:单例 1、为什么用单例模...

  • 设计模式(行为型)-- 观察者模式

    我们常把 23 种经典的设计模式分为三类:创建型、结构型、行为型。创建型设计模式主要解决“对象的创建”问题,结构型...

网友评论

      本文标题:创建型设计模式

      本文链接:https://www.haomeiwen.com/subject/yhpwkktx.html