设计模式——创建型设计模式总结(简单工厂、普通工厂、抽象工厂、建造者、原型和单例)

设计模式自己总结一句话描述 设计模式分为三大类: 创建型模式,共五种: 工厂方法模式、抽象工厂模式、单例模式、构建者模式、原型模式。 结构型模式,共七种: 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种: 策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。 立即下载

创建型设计模式总结

(转载请注明来源 http://www.cnblogs.com/jerry19880126/)

创建型设计模式包括简单工厂模式,普通工厂模式,抽象工厂模式,建造者模式,原型模式和最简单的单例模式。

 

简单工厂模式(Simple Factory)

 

从UML图中可以看出,工厂是具体的,Product是抽象的,里面的方法Operation是virtual的,它的三个子类是具体的,子类中的Operation覆盖父类的方法Operation,由多态知识可知,运行时将会调用子类的Operation,父类的Operation只是声明的“接口”。

多态有三个条件:一是父类的virtual,二是子类的覆盖(要求函数名、参数、返回值都要一模一样),三是父类的指针或引用指向子类的对象。前两个条件已经满足,下面关键是讨论第三个条件。

第三个条件的关键就是Factory了,Factory能根据客户端的请求,生成不同的具体对象,这可以用flag来标识,假定flag = 1时,生成ConcreteProduct1对象;flag = 2时,生成ConcreteProduct2对象。因此,可以在Factory这样写CreateProduct()。

Product* CreateProduct(flag)

{

Switch(flag)

case 1: return new ConcreateProduct1(); break;

case 2: return new ConcreateProduct2(); break;

case 3:…

}

 

在客户端只要用

Factory f; // 生成factory对象

f.getProduct(1).Operation();就可以调用ConcreteProduct1的方法了

f.getProduct(2).Operation();就可以调用ConcreteProudct2的方法了。

 

这样说来,相信读者已经明白,其实工厂方法就是根据客户端不同的“要求”,产生不同的具体对象,再利用多态特性,调用相应具体对象的方法。

 

下面给出可执行的源代码,与上述例子不尽相同,但思想是一样的,运行结果如下图所示。

简单工厂模式
复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 // 简单工厂模式
 5 
 6 // 抽象产品
 7 class AbstractProduct
 8 {
 9 public:
10     virtual void getProductsName() = 0;
11 };
12 
13 // 具体产品1
14 class ConcreteProduct1: public AbstractProduct
15 {
16 public:
17     void  getProductsName()
18     {
19         cout << "ConcreteProduct1" << endl;
20     }
21 };
22 
23 
24 // 具体产品2
25 class ConcreteProduct2: public AbstractProduct
26 {
27 public:
28     void  getProductsName()
29     {
30         cout << "ConcreteProduct2" << endl;
31     }
32 };
33 
34 
35 // 具体的工厂(没有抽象工厂)
36 class ConcreteFactory
37 {
38 public:
39     AbstractProduct* getProductObject(int flag)
40     {
41         if(flag == 1)
42         {
43             return new ConcreteProduct1();
44         }
45         else if(flag == 2)
46         {
47             return new ConcreteProduct2();
48         }
49         else
50         {
51             return 0;
52         }
53     }
54 };
55 
56 int main()
57 {
58     ConcreteFactory f;
59     AbstractProduct* p1 = f.getProductObject(1);
60     AbstractProduct* p2 = f.getProductObject(2);
61     p1->getProductsName();
62     p2->getProductsName();
63     delete p1;
64     delete p2;
65     return 0;
66 }
复制代码

 

运行结果如下:

 

(普通)工厂模式(Factory)

与简单工厂模式换汤不换药,只是把工厂也“抽象”了,UML图如下所示:

 

从上图可以看出,只不过多出一块抽象工厂而已。抽象工厂提供CreateProduct的虚接口,在ConcreteFactory中实现,为了便于说明问题,这里假定有两个ConcreteFactory,一个是ConcreteFactory1,只生产ConcreteProduct1产品,另一个是ConcreteFactory2,只生产ConcreteProduct2产品。

 

以ConcreteFactory1为例,代码框架如下:

class ConcreateFactory1: public Factory

{

 Product* CreateProduct()

{

     return new ConcreteProduct1();

}

};

 

在客户端用 Factory *f = new ConcreteFactory1(); f->CreateProduct();就可以得到ConcreteProduct1的对象了。

 

下面给出可执行的源代码,运行结果的截图放在后面。

普通工厂模式
复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 //普通工厂模式
 5 
 6 //抽象产品
 7 class AbstractProduct
 8 {
 9 public:
10     virtual void getProductName() = 0;
11 };
12 
13 //具体产品1
14 class ConcreteProduct1: public AbstractProduct
15 {
16 public:
17     void getProductName()
18     {
19         cout << "ConcreteProduct1" << endl;
20     }
21 };
22 
23 //具体产品2
24 class ConcreteProduct2: public AbstractProduct
25 {
26 public:
27     void getProductName()
28     {
29         cout << "ConcreteProduct2" << endl;
30     }
31 };
32 
33 
34 //抽象工厂
35 class AbstractFactory
36 {
37 public:
38     virtual AbstractProduct* getProduct() = 0;
39 };
40 
41 //具体工厂1
42 class ConcreteFactory1: public AbstractFactory
43 {
44 public:
45     AbstractProduct* getProduct()
46     {
47         return new ConcreteProduct1();
48     }
49 };
50 
51 
52 //具体工厂2
53 class ConcreteFactory2: public AbstractFactory
54 {
55 public:
56     AbstractProduct* getProduct()
57     {
58         return new ConcreteProduct2();
59     }
60 };
61 
62 int main()
63 {
64     AbstractFactory* f1 = new ConcreteFactory1();
65     AbstractFactory* f2 = new ConcreteFactory2();
66     f1->getProduct()->getProductName();
67     f2->getProduct()->getProductName();
68     delete f1, f2;
69     return 0;
70 }
复制代码

 

运行结果如下:

 

抽象工厂模式(Abstract Factory)

 

抽象工厂又是(普通)工厂模式的升级版,但本质是相同的。观察UML图,可以看到不同的地方在于多了一个抽象产品的类。

ConcreateFactory1只生产ProductA1和ProductB1,即下标带“1”的产品。可以预见,在ConcreteFactory1中的两个方法应该如下:

 

AbstractProductA* CreateProductA()

{

         return new ProductA1();

}

AbstractProductB* CreateProductB()

{

         return new ProductB1();

}

 

ConcreateFactory2中的两个方法类似,只是将最后的下标换成2而已。

 

下面给出可以执行的源代码,运行截图放在代码的后面。

抽象工厂模式
复制代码
  1 #include <iostream>
  2 
  3 using namespace std;
  4 
  5  
  6 
  7 // 抽象工厂模式
  8 
  9  
 10 
 11 // 抽象产品A
 12 
 13 class AbstractProductA
 14 
 15 {
 16 
 17 public:
 18 
 19          virtual void getProductName() = 0;
 20 
 21 };
 22 
 23  
 24 
 25 // 具体产品A1
 26 
 27 class ConcreteProductA1: public AbstractProductA
 28 
 29 {
 30 
 31 public:
 32 
 33          void getProductName()
 34 
 35          {
 36 
 37                    cout << "ConcreteProductA1" << endl;
 38 
 39          }
 40 
 41 };
 42 
 43  
 44 
 45  
 46 
 47 // 具体产品A2
 48 
 49 class ConcreteProductA2: public AbstractProductA
 50 
 51 {
 52 
 53 public:
 54 
 55          void getProductName()
 56 
 57          {
 58 
 59                    cout << "ConcreteProductA2" << endl;
 60 
 61          }
 62 
 63 };
 64 
 65  
 66 
 67  
 68 
 69 // 抽象产品B
 70 
 71 class AbstractProductB
 72 
 73 {
 74 
 75 public:
 76 
 77          virtual void getProductName() = 0;
 78 
 79 };
 80 
 81  
 82 
 83 // 具体产品B1
 84 
 85 class ConcreteProductB1: public AbstractProductB
 86 
 87 {
 88 
 89 public:
 90 
 91          void getProductName()
 92 
 93          {
 94 
 95                    cout << "ConcreteProductB1" << endl;
 96 
 97          }
 98 
 99 };
100 
101  
102 
103  
104 
105 // 具体产品B2
106 
107 class ConcreteProductB2: public AbstractProductB
108 
109 {
110 
111 public:
112 
113          void getProductName()
114 
115          {
116 
117                    cout << "ConcreteProductB2" << endl;
118 
119          }
120 
121 };
122 
123  
124 
125  
126 
127 // 抽象工厂
128 
129 class AbstractFactory
130 
131 {
132 
133 public:
134 
135          virtual AbstractProductA* getProductA() = 0;
136 
137          virtual AbstractProductB* getProductB() = 0;
138 
139 };
140 
141  
142 
143  
144 
145 // 具体工厂1
146 
147 class ConcreteFactory1: public AbstractFactory
148 
149 {
150 
151          AbstractProductA* getProductA()
152 
153          {
154 
155                    return new ConcreteProductA1;
156 
157          }
158 
159          AbstractProductB* getProductB()
160 
161          {
162 
163                    return new ConcreteProductB1;
164 
165          }
166 
167 };
168 
169  
170 
171 // 具体工厂2
172 
173 class ConcreteFactory2: public AbstractFactory
174 
175 {
176 
177          AbstractProductA* getProductA()
178 
179          {
180 
181                    return new ConcreteProductA2;
182 
183          }
184 
185  
186 
187          AbstractProductB* getProductB()
188 
189          {
190 
191                    return new ConcreteProductB2;
192 
193          }
194 
195 };
196 
197  
198 
199  
200 
201 int main()
202 
203 {
204 
205          AbstractFactory *f1 = new ConcreteFactory1();
206 
207          AbstractFactory *f2 = new ConcreteFactory2();
208 
209          f1->getProductA()->getProductName();
210 
211          f1->getProductB()->getProductName();
212 
213          f2->getProductA()->getProductName();
214 
215          f2->getProductB()->getProductName();
216 
217          delete f1, f2;
218 
219          return 0;
220 
221 }
复制代码

 

运行结果如下:

 

“工厂系列”设计模式总结

下面总结一下“工厂系列”设计模式,简单工厂模式只有一份抽象的产品,工厂是具体的;(普通)工厂模式的同样也只有一份抽象的产品,但工厂有抽象的了;抽象工厂模式工厂当然是抽象的,但是它独特的地方在于产品至少有两份是抽象的。

 

建造者模式(Builder)

 

建造者模式包含一个抽象的Builder类,还有它的若干子类——ConcreteBuilder,不用理会UML图上的Product,关键是看Director,Director里面的方法Construct()其实包含了Builder指针或引用的形参,由客户端传入某个ConcreateBuilder对象。Construct(Builder* builder)的方法大致如下:

Construct(Builder* builder)

{

         Builder->BuildPartA();

         Builder->BuildPartB();

         …

}

由多态性可知,客户端传进来的ConcreteBuilder是谁,就调用谁的方法。

 

可执行的源代码如下,运行结果在源代码的后面。

建造者模式
复制代码
  1 #include <iostream>
  2 
  3 using namespace std;
  4 
  5  
  6 
  7 // 建造者模式
  8 
  9  
 10 
 11 // 抽象建造者
 12 
 13 class AbstractBuilder
 14 
 15 {
 16 
 17 public:
 18 
 19          virtual void buildPart1() = 0;
 20 
 21          virtual void buildPart2() = 0;
 22 
 23 };
 24 
 25  
 26 
 27  
 28 
 29 //具体建造者1
 30 
 31 class ConcreteBuilder1: public AbstractBuilder
 32 
 33 {
 34 
 35 public:
 36 
 37          void buildPart1()
 38 
 39          {
 40 
 41                    cout << "用A构造第一部分" << endl;
 42 
 43          }
 44 
 45          void buildPart2()
 46 
 47          {
 48 
 49                    cout << "用B构造第二部分" << endl;
 50 
 51          }
 52 
 53 };
 54 
 55  
 56 
 57  
 58 
 59 //具体建造者2
 60 
 61 class ConcreteBuilder2: public AbstractBuilder
 62 
 63 {
 64 
 65 public:
 66 
 67          void buildPart1()
 68 
 69          {
 70 
 71                    cout << "用X构造第一部分" << endl;
 72 
 73          }
 74 
 75          void buildPart2()
 76 
 77          {
 78 
 79                    cout << "用Y构造第二部分" << endl;
 80 
 81          }
 82 
 83 };
 84 
 85  
 86 
 87 // 指挥者,注意其方法的参数是抽象建造者的指针
 88 
 89 class Director
 90 
 91 {
 92 
 93 public:
 94 
 95          void build(AbstractBuilder *builder)
 96 
 97          {
 98 
 99                    builder->buildPart1();
100 
101                    builder->buildPart2();
102 
103          }
104 
105 };
106 
107  
108 
109 int main()
110 
111 {
112 
113          Director d;
114 
115          d.build(new ConcreteBuilder1());
116 
117          d.build(new ConcreteBuilder2());
118 
119          return 0;
120 
121 }
复制代码

 

运行结果如下:

 

原型模式(Prototype)

 

听起来挺玄乎,其实说穿了,就是深拷贝问题。当一个类中包含了指针,那么这个类一定要显示规定三个东西:拷贝构造函数,重载”=”操作符以及析构函数。如果程序员使用编译器默认产生的这三个函数,那么得到的对象是原来对象的“浅拷贝”,即只是简单拷贝了指针的值(只复制了地址),没有复制指针指向空间的内容。“浅拷贝”只会保留最近的修改结果,而且在析构时容易出现重复析构的错误。

“深拷贝”是相对浅拷贝的概念说的,深拷贝不是简单的拷贝指针的值(地址),而是重新生成了一个新的空间,这个空间里存放的内容与传入类内容是完全相同的。

 

请看下面“浅拷贝”的实例:

 

浅拷贝
复制代码
 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5  
 6 
 7 // 原型模式,本质就是深拷贝
 8 
 9  
10 
11 // 浅拷贝,这时可以观察到p的地址是一样的,析构的时候因为重复释放同一地址空间,所以
12 
13 // 会出错。
14 
15 class PrototypeWrong
16 
17 {
18 
19 private:
20 
21          int a;
22 
23          int *p; // 有一个指针
24 
25 public:
26 
27          PrototypeWrong()
28 
29          {
30 
31                    a = 3;
32 
33                    p = new int(2);
34 
35          }
36 
37          void outputPointerAddress()
38 
39          {
40 
41                    cout << p << endl;
42 
43          }
44 
45  
46 
47          ~PrototypeWrong()
48 
49          {
50 
51                    delete p;
52 
53          }
54 
55 };
56 
57  
58 
59 int main()
60 
61 {
62 
63          // 这一部分是错误的原型模式的测试样例
64 
65          PrototypeWrong p1;
66 
67          PrototypeWrong p2 = p1;
68 
69          p1.outputPointerAddress();
70 
71          p2.outputPointerAddress();
72 
73 }
复制代码

 

运行结果为:

 

可以看到指针值(地址)是相同的,所以是浅拷贝,程序没有出现“请按任意键继续”的提示,说明程序其实是卡死的,原因是重复析构指针p。

 

再看看“深拷贝”的实例:

原型模式(深拷贝)
复制代码
 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5  
 6 
 7 // 原型模式,本质就是深拷贝
 8 
 9  
10 
11 // 深拷贝,正确的原型模式
12 
13 class PrototypeRight
14 
15 {
16 
17 private:
18 
19          int a;
20 
21          int *p; // 有一个指针
22 
23 public:
24 
25          PrototypeRight()
26 
27          {
28 
29                    a = 3;
30 
31                    p = new int(2);
32 
33          }
34 
35  
36 
37          // 不使用默认的拷贝构造函数!
38 
39          PrototypeRight(const PrototypeRight& obj)
40 
41          {
42 
43                    a = obj.a;
44 
45                    p = new int(*obj.p);
46 
47          }
48 
49  
50 
51          void outputPointerAddress()
52 
53          {
54 
55                    cout << p << endl;
56 
57          }
58 
59  
60 
61          ~PrototypeRight()
62 
63          {
64 
65                    delete p;
66 
67          }
68 
69 };
70 
71  
72 
73 int main()
74 
75 {
76 
77          // 这一部分是正确的原型模式的测试样例
78 
79         
80 
81          PrototypeRight p1;
82 
83          PrototypeRight p2 = p1;
84 
85          p1.outputPointerAddress();
86 
87          p2.outputPointerAddress();
88 
89          return 0;
90 
91         
92 
93 }
复制代码

 

运行结果如下:

 

可见指针值不同了,说明指向了不同的空间,而且成功显示了“请按任意键继续”的提示符,说明析构也是正常了。但这里的程序还不完整,按照C++的程序风格,还应该重载“=”运算符,这里的练习便留给读者。

 

单例模式(Singleton)

顾名思义,就是保证某个类只有一个实例(对象),这个应用还是很广的,假设腾迅想让用户每次只能用一个QQ登陆,就可以用到这个模式。

 

这个UML图非常简单,可以说也是所有设计模式中最简单的了,所以在面试中,常常被面试官们问起。

要使一个类只能生成一个对象,就是要限制使用它的构造函数,即将构造函数定义为private或protected的,然后另辟一个公有方法Instance,在这个方法里检查instance(instance是指向本类的一个指针或引用,这在C++语法中是可以的)是否为空指针,若为空指针,则说明是第一次生成对象,那么操作是允许的,instance = new Singleton(),若指针非空,说明在之前已经有一个对象(实例)了,单例模式不允许再次生成实例,因此直接返回之前生成的对象的地址。

将instance定义成static变量,就更符合“单例”模式了,因为static变量只有一份,它属于这个类,不属于某个对象。相应的Instance()方法应该也定义成static的,用Singleton::Instance()来调用。注意这里的static方法和变量是必须的,如果函数不是static,则要事先生成对象才能调用Instance,就破坏了“单例”的思想了,如果变量不是static,那么静态函数Instance又不能引用非static变量。

 

下面给出可以执行的源程序:

单例模式
复制代码
 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5  
 6 
 7 // 单例模式
 8 
 9 class Singleton
10 
11 {
12 
13 private:
14 
15          Singleton(){}; // 不允许直接构造其对象
16 
17          static Singleton *instance;
18 
19  
20 
21 public:
22 
23          static Singleton* createInstance()
24 
25          {
26 
27                    if(!instance)
28 
29                    {
30 
31                             // 对象第一次被创建,允许
32 
33                             cout << "创建新对象" << endl;
34 
35                             instance = new Singleton();
36 
37                    }
38 
39                    else
40 
41                    {
42 
43                             // 请求再次创建对象,不允许
44 
45                             cout << "已经创建过对象了,返回原对象" << endl;
46 
47                    }
48 
49                    return instance;
50 
51          }
52 
53          void getAddress()
54 
55          {
56 
57                    cout << "我的地址是 " << instance << endl;
58 
59          }
60 
61 };
62 
63  
64 
65 Singleton* Singleton::instance = 0; //在初始化的时候,不能在前面加static了
66 
67  
68 
69 int main()
70 
71 {
72 
73          //Singleton s;//报错:无法访问 private 成员(在“Singleton”类中声明)
74 
75          Singleton *s1 = Singleton::createInstance();
76 
77          s1->getAddress();
78 
79  
80 
81          cout << endl << endl;
82 
83  
84 
85          Singleton *s2 = Singleton::createInstance();
86 
87          s2->getAddress();
88 
89          return 0;
90 
91 }
复制代码

 

运行结果为:


设计模式所有实验及实验报告及代码.zip 软件设计模式概述 2GoF 的 23 种设计模式 3UML中的类图及类图之间的关系 4开闭原则 5里氏替换原则 6依赖倒置原则 7单一职责原则 8接口隔离原则 9迪米特法则 10合成复用原则 11创建型模式的特点和分类 12单例模式 13原型模式 14工厂方法模式 15抽象工厂模式 16建造者模式 17结构型模式概述 18代理模式 19适配器模式 20桥接模式 21装饰模式 22外观模式 23享元模式 24组合模式 25行为型模式概述 26模板方法模式 27策略模式 28命令模式 29责任链模式 30状态模式 31观察者模式 32中介者模式 33迭代器模式 34访问者模式 35备忘录模式 36解释器模式 37UMLet的使用与类图的设计 38创建型模式应用实验 39结构型模式应用实验 40行为型模式应用实验 所有实验及实验报告及代码 立即下载

相关推荐

18种C++版设计模式

2积分福利 供大家学习。 工厂,状态,观察者等18种设计模式 每一种设计模式有详细介绍,代码(C++),UML图工厂,状态,观察者等18种设计模式 每一种设计模式有详细介绍,代码(C++),UML图工厂,状态,观察者等18种设计模式 每一种设计模式有详细介绍,代码(C++),UML图工厂,状态,观察者等18种设计模式 每一种设计模式有详细介绍,代码(C++),UML图工厂,状态,观察者等18种设计模式 每一种设计模式有详细介绍,代码(C++),UML图

创建型设计模式总结

创建型设计模式1、单例模式1.1 饿汉式 (静态常量)1.2 饿汉式(静态代码块)1.3懒汉式 线程不安全1.4 懒汉式 线程安全,同步方法1.5 懒汉式 线程安全,同步代码块1.6 双重检查【推荐】1.7 静态内部类【推荐】1.8枚举【推荐】2、工厂模式(简单工厂、抽象工厂、工厂方法) 1、单例模式   所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例 ,并且该类只提供一个取得其对象实例的方法静态方法 。 1.1 饿汉式 (静态常量)   结论:可用,类加载时创

v慕言的博客 703

告别算力焦虑:手把手教你用华为CloudMatrix384超节点部署MoE大模型(附xDeepServe配置)

本文详细解析了如何在华为CloudMatrix384超节点上高效部署MoE大模型,通过xDeepServe框架配置和专家分配优化,实现2300 Tokens/s的推理吞吐。文章涵盖环境准备、性能调优、成本平衡及容灾设计,帮助开发者告别算力焦虑,提升AI推理效率。

weixin_30790841的博客 442

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

创建型模式总结 1. 概述 工厂模式注重于整体对象的获取,工厂类实际上封装了new对象的过程,而建造者模式旨在复杂对象的详细装配,根据对象的蓝图(我这里理解为对象的实体)在创建者(builder)类中可以调用工厂模式中的工厂类来获取复杂对象的组件对象,从而实现工厂模式和创建者模式的混合使用。 2. 简单工厂 2.1 类图 首先我们按照工厂方法创造玩具,我们来看类图。类图中我们按照玩具的种类分为两种...

weixin_42285505的博客 674

T-Box功能详解及应用

T - BOX,其全称为 Telematics Box,作为远程 / 车载通信模块,是一款集车身网络与无线通讯功能于一体的智能终端设备。它充当了多媒体车机与 TSP(汽车远程服务提供商)以及互联网之间的无线路由器角色,为用户创造了远程访问的可能。用户借助T - BOX能够对车辆配备的各个 ECU(电子控制单元)进行远程操控,包括远程启动或停止发动机开启或关闭空调天窗后备箱门车门,以及实现闪灯鸣笛等功能。

wgl110110的博客 5642

BLE蓝牙胎压监测

胎压监测系统新技术

qq_41851841的博客 1255

创建型设计模式(5种)

创建型设计模式(5种)

qq_52793248的博客 4490

提高机器学习模型准确率的八大方法

原文连接:http://www.techweb.com.cn/network/system/2016-01-27/2269274.shtml 此文仅是一个小品文,详细理论请读论文,参考书籍。 前言:我的概述 机器学习面对的是一个受限有穷空间 到 一个扩大的有穷空间 的泛化问题。若假设空间足以覆盖真实的数据空间,机器学习方法可以弃之不...

alppkk4545的博客 1301

设计模式(创建型)总结

创建型设计模式主要包含: 简单工厂模式(Simple Factory) 工厂方法模式(Factory Method) 抽象工厂模式(Abstract Factory) 原型模式(Prototype) 单例模式(Singleton) 建造者模式(Builder) 主要总结前三类。 以下所有类图翻译中不是创建在一个类里面,你也可以将他们创建在一个类里面 (1)简单工厂模式: 示例类图: ...

dms2017的博客 300

Sparse-ICP—(4) 加权稀疏迭代最近点算法(matlab版)

本文介绍了加权稀疏迭代最近点算法的实现。

点云侠的博客 643

Python爬虫实战:利用最新技术高效爬取百度贴吧帖子内容

本文将详细介绍如何使用Python最新技术栈构建一个高效的百度贴吧爬虫,包括requests-html异步请求、BeautifulSoup4解析、数据存储到MongoDB以及应对反爬机制等完整解决方案。文章包含5000余字详细教程和完整代码实现。网络爬虫(Web Crawler)是一种自动获取网页内容的程序,广泛应用于搜索引擎、数据分析和内容聚合等领域。Python凭借其丰富的库生态系统成为爬虫开发的首选语言。贴吧作为中文互联网最大的兴趣社区,包含大量有价值的UGC内容。动态加载内容处理登录状态维持。

2201_76125261的博客 541

设计模式——创建型设计模式总结(简单工厂、普通工厂、抽象工厂、建造者、原型和单例)...

创建型设计模式总结 (转载请注明来源http://www.cnblogs.com/jerry19880126/) 创建型设计模式包括简单工厂模式,普通工厂模式,抽象工厂模式,建造者模式,原型模式和最简单的单例模式。 简单工厂模式(Simple Factory) 从UML图中可以看出,工厂是具体的,Product是抽象的,里面的方法Operation是virtual的,它的...

weixin_30752699的博客 218

Python爬虫实战:全方位解析前程无忧(51job)职位详情爬取及反爬破解

平台规模:覆盖全国各行业、数百万条岗位信息。数据特点:职位描述详细,职位标签丰富。数据价值:支持招聘趋势分析、职业发展研究、薪资行情调研。推荐Python 3.10+,支持最新async特性与库兼容。

2201_76125261的博客 1487

【转】设计模式——创建型设计模式总结(简单工厂、普通工厂、抽象工厂、建造者、原型和单例)...

设计模式——创建型设计模式总结(简单工厂、普通工厂、抽象工厂、建造者、原型和单例) 创建型设计模式总结 (转载请注明来源http://www.cnblogs.com/jerry19880126/) 创建型设计模式包括简单工厂模式,普通工厂模式,抽象工厂模式,建造者模式,原型模式和最简单的单例模式。 简单工厂模式(Simple Factory) 从UML图中...

weixin_30527423的博客 84

AutoSAR系列讲解(入门篇)1.2-AutoSAR概述

这里主要说明了AutoSAR是个什么,还有其工具链

雪云飞星的博客 5万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java之美[从菜鸟到高手演变]之设计模式

很简单,一个原型类,只需要实现Cloneable接口,覆写clone方法,此处clone方法可以改成任意的名称,因为Cloneable接口是个空接口,你可以任意定义实现类的方法名,如cloneA或者cloneB,因为此处的重点是super.clone()这句话,super.clone()调用的是Object的clone()方法,而在Object类中,clone()是native的,具体怎么实现,我会在另一篇文章中,关于解读Java中本地方法的调用,此处不再深究。本小结会通过对象的复制,进行讲解。

智慧演绎,无处不在 47万+

SAP B1中文培訓教材_SDK

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

Java经典设计模式之五大创建型模式(附实例和详解)

一、概况总体来说设计模式分为三大类:(1)创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。(2)结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。(3)行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。二、设计模式的六大原则1

小宝鸽 3万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

深度学习工具包 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")

Java设计模式---(创建型模式)工厂、单例、建造者、原型

Java设计模式---(创建型模式)

似霰的博客 1468

【设计模式】创建型模式:单例、抽象工厂、工厂、建造者、原型

设计模式之创建型模式什么是创建型模式1、单例模式1.1 单例模式的实现方式1.1.1 懒汉式1.1.1.1 普通懒汉式1.1.1.2 多线程时的懒汉式单例1.1.1.3 线程安全的懒汉式1.1.1.3.1 在getInstance()方法上加同步锁1.1.1.3.2 双重检索锁定线程同步synchronized1.1.1.3.3 静态内部类1.1.2 饿汉式2、抽象工厂模式2.1 抽象工厂模式的实现方式2.1.1 创建抽象工厂类,定义具体工厂的公共接口:2.1.2 创建抽象产品类,定义具体产品的公共接口:2

weixin_42453637的博客 1103

创建型设计模式优缺点总结及场景应用Java

设计模式描述优点缺点单例模式确保对象的唯一性1. 单例对象在内存中只有一个,可以减少内存开支,不过在java中要注意垃圾回收机制的影响。2. 单例模式提供了对唯一示例的受控访问。因为单例类封装了它的唯一实例,所以它可以严格控制客户怎样以及何时访问它。3. 允许可变数目实例。1. 单例模式中没有抽象层,因此扩展困难,若要扩展,除非修改代码,基本上没有第二种途径。2.面向对象语言垃圾回收机制,当对象长时间不使用,被销毁回收,导致实例需要重新创建,且单例状态丢失简单工厂模式。

SheepYangStudy的博客 2096

设计模式|创建型模式

目录 前言 读懂UML图 设计模式六大原则 创建型模式原则 创建型模式 分析 1.简单工厂模式 2.工厂方法模式 3.抽象工厂方法模式 4.建造者模式 5.单例模式 创建型模式 总结 前言 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,设计模式不是具体的代码,而是一种合理、易拓展、易维护的代码架构思想。设计模式被运用在各种优秀的框架中。掌握设...

leo187的博客 2422

设计模式(二):创建型模式之单例模式、原型模式、工厂方法模式、抽象工厂模式和建造者模式

设计模式之创建型模式 由单例模式、原型模式、工厂方法模式、抽象工厂模式和建造者模式为代表的创建型模式,它的主要关注点是“怎样创建对象?”,主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的工厂来完成。就像我们去商场购买商品时,不需要知道商品是怎么生产出来一样,因为它们由专门的厂商生产。 创建型模式分为以下几种: 单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。 原型(Pr

HX_2021 647

2.5万字详解23种设计模式—创建型模式(简单工厂、工厂方法、抽象工厂、单例-多线程安全详解、建造者、原型)的详细解读、UML类图

2.5万字详解23种设计模式—创建型模式(简单工厂、工厂方法、抽象工厂、单例-多线程安全详解、建造者、原型)的详细解读、UML类图

qc 797

设计模式之创建型模式

总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式装饰器模式代理模式外观模式、桥接模式、组合模式、享元模式。行为型模式,共十一种:策略模式、模板方法模式观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

2401_87236806的博客 806
上一篇: 趋势科技2011校招笔试题+答案解析
下一篇: 华为2011上机笔试题3+参考程序
edward0004
博客等级 码龄15年 65粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值