设计模式创建型

简介: 设计模式创建型

设计模式创建型

四:总结&提升
一:前言

最近在进行设计模式的学习,今天将创建型的设计模式总结在这里,区分不同的设计模式的用法和作用


二:五个模式

2.1 创建型模式是什么?

创建型设计模式是一类软件设计模式,它们提供了一种在创建对象时增强灵活性和重用性的方法。

这些模式隐藏了对象的创建过程,使客户端代码能够与创建过程分离,从而降低了耦合性并提高了可维护性。

2.2 创建型模式的构成

创建型设计模式包括、工厂方法模式、原型模式、抽象工厂模式、建(构)造者模式 单例模式和。每个模式都有不同的用途和特点,它们可以在不同的情况下用于创建对象,以满足不同的需求。

用一个顺口溜表示就是:

公园瞅单狗(工厂、原型、抽象工厂、单例、构造者),公园里瞅单身狗,给他找个对象。


三:五个模式以及代码实现

3.1 工厂方法模式

3.1.1 概念

工厂方法模式是一种创建型设计模式,它将对象的创建委托给子类来完成。它通过定义一个创建对象的接口,但是将具体对象的创建延迟到子类中进行。这样,客户端代码不需要知道创建哪个具体的对象,只需要知道使用哪个工厂来创建对象即可。


工厂方法模式包含以下几个要素:


一个抽象的工厂接口,定义了创建对象的方法。

一组具体的工厂类,实现了工厂接口,负责创建具体的对象。

一个抽象的产品接口,定义了产品的通用属性和方法。

一组具体的产品类,实现了产品接口,是工厂创建的具体对象。

客户端代码使用工厂方法模式来创建对象时,只需要使用抽象工厂接口来创建对象,而无需关心具体的产品实现。当需要创建不同类型的对象时,只需要添加相应的具体工厂和产品即可,而不需要修改客户端代码。


3.1.2 代码例子

 //抽象的工厂
    internal interface ICreator 
    {
        //返回一个产品
        IProduct FactoryMethod();
    }
    //抽象的产品
    interface IProduct
    {    
    }
    //具体的工厂
    class ConcreteCreator : ICreator
    {
        //创建的是一个具体的产品
        public IProduct FactoryMethod()
        {
            return new ConcreteProduct();
        }
    }
    //具体的产品
    class ConcreteProduct : IProduct
    { }

最后创建的是具体的产品。如果增加了新的需求的话,我们可以增加一个新的工厂,然后增加一个新的产品。客户端依赖的是抽象的产品和抽象的工厂


3.2 原型模式

3.2.1 概念

用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。

原型模式包含以下主要角色:


抽象原型类:规定了具体原型对象必须实现的接口。

- 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。

访问类:使用具体原型类中的 clone() 方法来复制新的对象。

原型模式的克隆分为浅克隆和深克隆。


浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。

深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。

3.2.2 代码示例

    //抽象类
    abstract class Prototype
    {
        private string id;
        public Prototype(string id)
        {
            this.id = id;
        }
        public string Id
        { get { return this.id; } }
        public abstract Prototype Clone();
    }
    class ConcretePrototype1 : Prototype
    {
        public ConcretePrototype1(string id) : base(id)
        { }
        public override Prototype Clone()
        {
            return (Prototype)this.MemberwiseClone();
        }
    }

3.3 抽象工厂模式

3.3.1 抽象工厂模式

抽象工厂模式的主要角色如下。

抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。

也就是说和工厂方法相比,抽象工厂抽象的是各类工厂,具体工厂可以实现为多个工厂。抽象产品也有多个,并且每个抽象产品下面都可以实现多个具体的产品。


3.4 单例模式

3.4.1 基本概念:

单例模式是一种创建型设计模式,用于确保一个类只有一个实例,并提供全局访问点以访问该实例。这意味着无论在系统中的哪个位置调用该类的实例,都始终返回同一个实例。


单例模式通常在需要共享资源的情况下使用,例如数据库连接,日志记录器等。通过使用单例模式,可以避免不必要的对象创建和销毁,从而提高系统的性能和效率。


单例模式的实现通常包括以下几个要素:


私有的构造函数,防止类在外部被实例化。

私有的静态实例变量,用于保存该类的唯一实例。

公共的静态方法,用于返回该类的唯一实例。

需要注意的是,由于单例模式只允许一个实例,因此在多线程环境中需要进行同步处理,以确保线程安全。


3.4.2 代码示例

  internal class Single
    {
         private  static Single single;   //建立一个全局对象
        private Single()    //将构造函数进行隐藏,外部不可访问
        { }
        public  static Single GetSingle()
        {
            if (single ==null)  //如果第一次访问的话,就完成对象初始化
            {
                single = new Single();
            }
            return single;
        }
    }

3.4.3 要点

单例模式一共有三个要点。


某个类只能有一个实例;

它必须自行创建这个实例。

它必须向整个系统提供这个实例。

对应到代码上来说就是:私有构造函数、私有静态对象、共有创建获取的方法。


3.5(构)建造者模式

3.5.1 概念

建造者模式是一种创建型设计模式,它将一个复杂对象的构建过程分解成多个简单对象的构建过程,使得对象构建过程更加灵活和可控。


建造者模式包含以下几个要素:


一个抽象的建造者接口,定义了复杂对象的构建过程。

一组具体的建造者类,实现了建造者接口,负责构建复杂对象的各个部分。

一个指挥者类,它包含一个建造者对象,并使用建造者对象中的方法来构建对象。

一个产品类,它包含了要构建的复杂对象的各个部分。

客户端代码使用建造者模式来构建复杂对象时,只需要将建造者对象传递给指挥者对象,由指挥者对象来使用建造者对象中的方法构建对象。客户端代码不需要直接创建复杂对象,也不需要了解具体的构建过程,从而提高了代码的可维护性和可扩展性。


3.5.2 代码示例

    //产品
    class Product
    {
        //产品属性
        private string A;
        private string B;
        private string C;
        //给产品属性赋值的方法
        public void setPartA(string A)
        {
            this.A = A;
        }
        public void setPartB(string B)
        {
            this.B = B;
        }
        public void setPartC(string C)
        {
            this.C = C;
        }
    }
    //抽象的建造者
    abstract class Builder
    {
        //创建产品对象
        protected Product product = new Product();
        //产品对象的具体构造,父类定义了构造结构,子类具体构造
        public abstract void BuildPartA();
        public abstract void BuildPartB();
        public abstract void BuildPartC();
        //获得产品对象
        public Product GetProduct() { 
            return product;
        }
    }
    //具体建造者
    class ConcreteBuilder1 : Builder
    {
        public override void BuildPartA()
        {
            product.setPartA("属性1A");
        }
        public override void BuildPartB()
        {
            product.setPartB("属性1B");
        }
        public override void BuildPartC()
        {
            product.setPartC("属性1C");
        }
    }
    //具体建造者2
    class ConcreteBuilder2 : Builder
    {
        public override void BuildPartA()
        {
            product.setPartA("属性2A");
        }
        public override void BuildPartB()
        {
            product.setPartB("属性2B");
        }
        public override void BuildPartC()
        {
            product.setPartC("属性2C");
        }
    }
    //指挥者
    class Direcotr {
        //声明一个建造者对象
        private Builder builder;
        //指挥者的构造函数,因为指挥者类就是为了指挥建造者建造产品的,所以在构造函数里传入
        public Direcotr(Builder builder)    //这里传进来的是具体的建造者的对象
        {
            this.builder = builder;
        }
        //下面的方法为具体建造过程方法
        public Product Construct() {
            builder.BuildPartA();   //先建造1
            builder.BuildPartB();   //在建造2
            builder.BuildPartC();   //在建造3
            return builder.GetProduct();    //获得建造好得对象
        }
    }

四:总结&提升

本文讲述了设计模式中5个创建型模式,并且给出了对应的代码示例。用好设计模式可以大大的提升我们的代码的维护性、扩充性。希望大家看完这篇文章能了解,学会这5个设计模式,并且以后在用的时候能想起来。

目录
相关文章
|
2天前
|
设计模式
**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合
【6月更文挑战第23天】**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合。工厂模式专注于单个对象,通过具体工厂创建具体产品,适用于简单对象创建;抽象工厂则关注一系列相关产品,提供创建一族对象的接口,适用于处理多个不兼容产品族。选择模式基于问题域的复杂性,单个产品需求时用工厂模式,多产品族时用抽象工厂模式。
12 5
|
1月前
|
设计模式 搜索推荐 数据库连接
第二篇 创建型设计模式 - 灵活、解耦的创建机制
第二篇 创建型设计模式 - 灵活、解耦的创建机制
|
5天前
|
设计模式 Oracle Java
工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。
【6月更文挑战第20天】工厂模式简化对象创建,根据参数或条件生成MySQL或Oracle数据库连接。`DatabaseConnectionFactory`作为工厂,动态返回具体连接类型。装饰器模式则用于运行时动态增加对象功能,如`LoggingDecorator`为`Runnable`对象添加日志记录,保持代码整洁。在`Main`类中展示了如何使用这两种模式。
21 6
|
5天前
|
设计模式
创建型设计模式之建造者模式
创建型设计模式之建造者模式
|
1月前
|
设计模式 测试技术 Go
[设计模式 Go实现] 创建型~ 原型模式
[设计模式 Go实现] 创建型~ 原型模式
|
1月前
|
设计模式 测试技术 Go
[设计模式 Go实现] 创建型~工厂方法模式
[设计模式 Go实现] 创建型~工厂方法模式
|
1月前
|
设计模式 测试技术 Go
[设计模式 Go实现] 创建型~建造者模式
[设计模式 Go实现] 创建型~建造者模式
|
1月前
|
设计模式 JavaScript 前端开发
[设计模式Java实现附plantuml源码~创建型] 复杂对象的组装与创建——建造者模式
[设计模式Java实现附plantuml源码~创建型] 复杂对象的组装与创建——建造者模式
|
1月前
|
设计模式 Java Go
[设计模式Java实现附plantuml源码~创建型] 对象的克隆~原型模式
[设计模式Java实现附plantuml源码~创建型] 对象的克隆~原型模式
|
1月前
|
设计模式 Java Go
[设计模式Java实现附plantuml源码~创建型] 产品族的创建——抽象工厂模式
[设计模式Java实现附plantuml源码~创建型] 产品族的创建——抽象工厂模式