设计模式-创建型模式

23种设计模式-创建型模式 工厂方法模式(Factory Method Pattern)是创建型设计模式的一种,它提供了一种创建对象的最佳方式。在工厂方法模式中,对象的创建是通过调用一个工厂方法而不是直接调用构造器来完成的。这个工厂方法可以是指定的接口并由子类实现,或者是类的抽象方法。定义工厂方法模式定义了一个创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。涉及到的关键类或接口Product(产品角色):定义工厂方法所创建的对象的接口。ConcreteProduct(具体产品角色) 阅读详情

原文地址:http://blog.youkuaiyun.com/column/details/pattern.html?&page=1

创建型模式

  • 单例模式
  • 工厂方法模式
  • 抽象工厂模式
  • 建造者模式
  • 原型模式

单例模式

定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

这里写图片描述

饿汉式单例

    public class Singleton {  
        private static Singleton singleton = new Singleton();  
        private Singleton(){}  
        public static Singleton getInstance(){  
            return singleton;  
        }  
    } 

懒汉式单例(线程安全)

    public class Singleton {  
        private static Singleton singleton;  
        private Singleton(){}           
    public static synchronized Singleton getInstance(){  
            if(singleton==null){  
                singleton = new Singleton();  
            }  
            return singleton;  
        }  
    }  

工厂方法模式

定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。

这里写图片描述

简单地说:具体对象由具体的对象工长来创建。


抽象工厂模式

定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

抽象工厂模式是工厂方法模式的升级。区别在于抽象工厂模式提供一组相关对象生产的接口方法,而工厂方法提供一个对象生产的接口方法。

UML类图是一致的。

无需纠结使用的是抽象工厂模式还是工厂方法模式,主要目的都是用来解耦。


建造者模式

定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

这里写图片描述

相对于工厂模式,建造者模式在最终调用者之间多了一个Director类。

Builder用来提供创建最终产品的各个零部件方法,Director用来确定组装各个零部件的顺序来产生最终的产品。具体Builder的实现持有一个最终产品的私有属性。

建造者模式和工厂模式非常相似,建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程。


原型模式

定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。

这里写图片描述

原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件:

  • 实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。
  • 重写Object类中的clone方法。Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,Prototype类需要将clone方法的作用域修改为public类型。

原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式。

使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。

在一个循环体内创建对象,假如对象创建过程比较复杂或者循环次数很多的话,使用原型模式不但可以简化创建过程,而且可以使系统的整体性能提高很多。

在使用原型模式时,要注意深拷贝与浅拷贝的问题。

设计模式之创建型5种 设计模式之所以被归纳为23种,而非其他数量,源于GoF(Gang of Four)在1994年的系统性总结和分类。 阅读详情

相关推荐

代码的艺术之路——创建型设计模式

每种设计模式,不同于网上千篇一律的定义或模板代码,我都尽可能从解决工作实际问题出发,通过代码一步步演进最终的设计模式,每种设计模式都力求讲清其来龙去脉,并解剖出一些较为独特的想法和见解,望对诸君能有所帮助!

weixin_45479946的博客 1474

《设计模式》创建型模式总结

首先,要明确这里所说的设计模式重点聚焦系统级的设计,系统本质上是一组类实例的组合,它区别于单一的类或者接口的设计,需要一定的抽象才能够使得后续的编码工作更有效率。创建型模式的最主要作用就是抽象了系统的实例化过程。在没有这种抽象之前,系统的实例化只是单纯的被看作是N个类的实例化,不利于后续的编码执行。这种抽象在大体上有两个实现的原则。其一是将系统所需要用到的各种类信息给封装起来;其二是把这些类的创建和组合方式也给隐藏起来。总之,整个系统有一套抽象的接口负责统一和外部对接。

weixin_50353846的博客 1446

Llama模型结构拆解:为什么MLP模块要这样设计?从参数配置到计算流程全解析

本文深入解析了Llama模型MLP模块的设计精髓。通过拆解其三线性层结构、门控机制与SwiGLU激活函数,揭示了并行计算如何提升效率,并详细阐述了intermediate_size参数配置背后的经验权衡与计算考量,帮助读者透彻理解这一核心组件的设计逻辑与工程实现。

mac99的博客 529

设计模式之创建型模式详解

简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。

zengchenAAA的博客 1769

深入瑞芯微SDK:手把手解析Uboot、Kernel到Rootfs的镜像生成与烧录

本文深入解析瑞芯微SDK中从Uboot、Kernel到Rootfs的镜像生成与烧录全流程,揭示编译背后的技术细节。通过详细分析SDK架构、镜像生成流水线、分区表定制、Rootfs构建及烧录科学,帮助开发者从会编译进阶到懂原理,掌握系统级开发的关键技术。

weixin_29193359的博客 270

NFC门禁卡复制全解析:从M1卡到UID卡的攻防实践

本文深入解析了NFC门禁卡的安全机制与攻防实践。从M1卡基于Crypto1算法的原理漏洞讲起,详细阐述了利用Proxmark3等工具进行侦听、破解密钥及使用UID卡进行复制的完整攻击链条。同时,为防御方提供了从升级CPU卡、启用全扇区认证到部署多因子验证的系统性防护策略,旨在帮助管理员构建更稳固的物理安全防线。

weixin_29182481的博客 1401

Java 创建型设计模式详解

概念抽象工厂模式提供了一个接口,用于创建一系列相关或互相依赖的对象,而无需指定它们的具体类。它通常用于创建一组相关产品,如操作系统的不同界面风格。结构抽象工厂类(AbstractFactory):声明创建一组相关产品的方法。具体工厂类(ConcreteFactory):实现抽象工厂的方法,生成一系列具体产品。抽象产品类(AbstractProduct):定义产品的接口。具体产品类(ConcreteProduct):实现具体产品。示例代码// 抽象产品Avoid use();

WenZhang的博客 2309

Linux音频调试实战:ALSA架构与tinymix工具的高级应用技巧

本文深入探讨了Linux音频调试的核心技术,重点解析了ALSA架构下音频信号的路由与混合机制。通过介绍轻量级命令行工具tinymix的高级应用技巧,指导开发者如何精准排查无声、音量异常、多路音频共存等复杂问题,并分享编写自动化测试脚本以提升嵌入式及智能设备音频开发效率的实战方法。

weixin_29210727的博客 101

设计模式--六种创建型模式

前言   每几种模式之间都有一定的联系,从中发现它们的相同点和不同点,研究发生改变的节点,这就是本篇博客所要说明的创建型设计模式之间的联系。它们包括:简单工厂模式、单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。 创建型模式的基本理解 创建型模式抽象了实例化过程。它们帮助一个系统独立于如何创建、组合和表示它的那些对象。 一个类创建型模式使用继承改变被实例

冯浩月 9638

zabbix添加IBM服务器SNMPV3监控

本地采用欧冠的是zabbix5.0,服务器型号是SR860,使用snmpv3因为只支持这个,醉了。说明:本地采用欧冠的是zabbix5.0,服务器型号是SR860。

萌新包大人的博客 1984

微信H5网页支付JSAPI部分用户报错:system:access_denied 的解决方案

JSAPI 支付仅支持微信内置浏览器调用。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1686

设计模式——创建型模式

创建型模式是软件工程中常用的设计模式之一,主要关注对象的创建过程。创建型模式隐藏了对象创建的细节,而不是直接使用new操作符创建对象。

2301_79654063的博客 1403

DLMS/COSEM协议的理解体会

DLMS是通信协议,COSEM是电表建模规范。HDLC帧基本格式为0x7e......

一个bug是bug,多个bug能work 8312

设计模式创建型

最近在进行设计模式的学习,今天将创建型的设计模式总结在这里,区分不同的设计模式的用法和作用本文讲述了设计模式中5个创建型模式,并且给出了对应的代码示例。用好设计模式可以大大的提升我们的代码的维护性、扩充性。希望大家看完这篇文章能了解,学会这5个设计模式,并且以后在用的时候能想起来。

郝老三~~~~~~~~~~~~~ 5082

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java设计模式之创建型模式

单例模式 应用场合: 在一个JVM中,该对象只需有一个实例存在 特点: 对于创建频繁的大型对象可以降低系统开销 减轻GC压力(Garbage collection) 安全(核心交易引擎) 实现方式: 加载类时直接创建类的实例(性能提前消耗 浪费) public class Singleton { private Singleton(){}; private

yhao的博客 3823

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C++设计模式之创建型模式

我们一定要牢记设计模式是前人总结的一套可以有效解决问题的经验,不要一写代码就在考虑该使用什么设计模式,这是极其不可取的。正确的做法应该是在实现业务需求的同时,尽量遵守面向对象设计的六大设计原则即可。后期随着业务的扩展,你的代码会不断的演化和重构,在此过程中设计模式绝逼会大放异彩的。说实话博主写完这篇文章感觉原型模式模式是不是有点多余啊,想复制原来创建的新的对象,使用拷贝构造函数不就可以了嘛,为什么还要弄一个新的设计模式出来呢。目前博主的理解就到这啦,有兴趣的可以后台TT博主一起交流呀!

weixin_62196764的博客 1105

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

设计模式-创建型模式总结

创建型模式,顾名思义,就是用来创建对象的模式。它抽象了实例化过程,帮助一个系统独立于如何创建、组合和表示它的对象。

潘威威的博客 2559

设计模式之创建型模式

在Java中,有23种经典的设计模式,它们分为三种类型:创建型模式、结构型模式和行为型模式。创建型模式:创建型模式是一种设计模式,主要用于处理对象的创建过程,它将对象的创建和使用分离,使得系统更加灵活和可扩展。结构型模式;结构型设计模式主要关注对象组合的方式,用于描述如何将类或对象结合在一起形成更大的结构。行为型模式:行为型设计模式主要关注对象之间的通信和职责分配,描述了对象之间的相互作用和责任分配方式。

emmmm的博客 1339

设计模式之创建型设计模式

创建型设计模式是用于对象的创建和实例化的模式,旨在解决对象的创建问题,以便更加灵活地创建对象并将对象与使用它们的代码分离。单例模式(Singleton Pattern):确保一个类只有一个实例,并提供对该实例的全局访问点。工厂模式(Factory Pattern):定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类中。抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或依赖对象的接口,而无需指定它们具体的类。

zz18532164242的博客 766

C#常见的设计模式-创建型模式

抽象工厂模式提供了一个接口来创建一系列相互依赖或者有关联的对象,而不用指定他们具体的类。在C#中,我们可以通过使用抽象类或者接口来实现抽象工厂模式。创建型模式是软件设计中的重要概念,可以帮助我们更好地组织和管理对象的创建过程。本篇文章介绍了C#中常见的创建型模式,包括简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、原型模式和建造者模式。通过熟悉和灵活应用这些模式,我们可以写出更加可维护、可扩展和可测试的代码。

故事不长丨的博客 1899

设计模式(创建型)

不使用设计模式时,手动复制每个属性不仅容易出错,还可能导致代码冗长和难以维护。尤其当类的属性较多或者可能在未来发生变化时,手动复制每个属性的成本会增加。使用建造者模式构建拥有多个属性的复杂对象时,能够显著提高代码的可读性、可维护性和灵活性,减少出错的可能性。特别是在面对具有多个可选属性的大型对象时,建造者模式是一种非常合适的设计模式。扩展灵活性:如果要添加新的订单类型,比如国际订单,只需新增一个类和,而无需修改现有代码。低耦合性。

xue2464874018的博客 978
上一篇: 设计模式的六大原则
下一篇: 设计模式-行为型模式
AlainGogogo
博客等级 码龄18年 5粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值