**Մոդուլ** (անգլ.՝ Module), կառուցվածքային նախագծման ձևանմուշ, որն օգտագործվում է ծրագրավորման մոդուլի հասկացողությունն իրականացնելու համար այն ծրագրավորման լեզուներում, որտեղ այդ հասկացողությունը չի սպասարկվում։

Ծրագրավորման լեզվից կախված այս ձևանմուշը կարելի է իրականացնել տարբեր կերպ՝ որպես եզակի օգտագործման ձևանմուշ, օբյեկտ-կողմնորոշված ստատիկ անդամ (անգլ.՝ static member) դասում և պրոցեդուրային գլոբալ ֆունկցիաներում։ Python-ում ձևանմուշը ներկառուցված է լեզվի մեջ և յուրաքանչյուր .py ֆայլը ավտոմատորեն հանդիսանում է մոդուլ։

Ընդհանուր հասկացողություններ
----------------------------

* Client - հայցող
* Instance - նմուշ
* Implementation - իրականացում
* Product - արգասիք

Նկարագրություն և կառուցվածք
---------------------------

Մոդուլ ձևանմուշը ապահովում է ֆունկցիաներ և ստատիկ կառուցվածքներ մուդուլային հասկացողությունն այն լեզուներում իրականացնելու համար, որոնք չեն սպասարկում այդ հասկացողությունը։

Հատկանիշներ
-----------

Այս ձևանմուշը եզակի նախագծման կամ այլ խմբի ձևանմուշներով իրականացնելիս պետք է հաշվի առնել, որ ձևանմուշը պետք է ապահովի հետևյալ հատկանիշներին.

* Ծրագրի կոդի մի մասը պետք է լինի գլոբալ կամ ունենա public հասանելիություն որպես գլոբալ կամ public կոդ։ private կամ protected կոդը կարելի է իրականացնել public կոդի միջոցով։
* Մոդուլը պետք է ունենա ինիցիալիզադիայի ֆունկցիա, որը համարժեք է օբյեկտ-կնոստրուկտոր մեթոդին։ Այս հատկանիշը չի սպասարկվում ռեգուլյար `namespace`-ով։
* Մոդուլը պետք է ունենա `finalizer` ֆունկցիա, որն համարժեք է օբյեկտի դեստրուկտորին։ Այս ֆունկցիան նույնպես չի սպասարկվում ռեգուլյար `namespace`-ի կողմից։
* Ֆունկցիաների շատ անդամենր, որոնք գործողություններ են իրականացնում դասի մեջ, տրվում են ֆունկցիայի կանչի արգումենտների տեսքով։ Նմանատիպ ֆունկցիաներ են օրինակ "utilities", "tools" կամ "libraries":

Օրինակներ
---------

### C# (C Sharp .Net)

#### Հայտարարում

```
using System;
using System.IO;
using System.Text;

namespace Consoles {

 public sealed class MainModule {
 private static MainModule Singleton = null;
 public InputStream input = null;
 public OutputStream output = null;
 public ErrorStream error = null;

 // ...

 public MainModule () {
 // does nothing on purpose !!!
 }

 // ...

 public MainModule getSingleton() {
 if (MainModule.Singleton == null)
 {
 MainModule.Singleton = new MainModule();
 }

 return MainModule.Singleton;
 }

 // ...

 public void prepare() {
 //System.WriteLine("console::prepare();");

 this.input = new InputStream();
 this.output = new OutputStream();
 this.error = new ErrorStream();
 }
 
 public void unprepare() {
 this.output = null;
 this.input = null;
 this.error = null;
 
 //System.WriteLine("console::unprepare();");
 }
 
 // ...
 
 public void printNewLine() {
 System.Console.WriteLine("");
 }
 
 public void printString(String Value) {
 System.Console.Write(Value);
 }
 
 public void printInteger(Integer Value) {
 System.Console.Write(Value);
 }
 
 public void printBoolean(Boolean Value) {
 System.Console.Write(Value);
 }
 
 public void ScanNewLine() {
 // to-do: ...
 }
 
 public void ScanString(String Value) {
 // to-do: ...
 }
 
 public void ScanInteger(Integer Value) {
 // to-do: ...
 }
 
 public void ScanBoolean(Boolean Value) {
 // to-do: ...
 }
 
 // ...
 
 }
}

```

#### Իրականացում

```
 class ConsoleDemo {
 public static Consoles.MainModule Console = null;
 
 public static void prepare()
 {
 Console = Consoles.MainModule.getSingleton();
 
 Console.prepare();
 }
 
 public static void unprepare()
 {
 Console.unprepare();
 }
 
 public static void execute()
 {
 Console.PrintString("Hello World");
 Console.PrintNewLine();
 Console.ScanNewLine();
 }
 
 public static void main()
 {
 prepare();
 execute(args);
 unprepare();
 }
 }

```

### Java

#### Հայտարարում

```
package consoles;

import java.io.InputStream;
import java.io.PrintStream;

public final class MainModule {

 private static MainModule singleton = null;

 public InputStream input = null;
 public PrintStream output = null;
 public PrintStream error = null;

 public MainModule() {
 // does nothing on purpose !!!
 }

 // ...

 public static MainModule getSingleton() {
 if (MainModule.singleton == null) {
 MainModule.singleton = new MainModule();
 }
 
 return MainModule.singleton;
 }

 // ...

 public void prepare() {
 //System.out.println("consoles::prepare();");

 this.input = new InputStream();
 this.output = new PrintStream();
 this.error = new PrintStream();
 }
 
 public void unprepare() {
 this.output = null;
 this.input = null;
 this.error = null;
 
 //System.out.println("consoles::unprepare();");
 }
 
 // ...
 
 public void printNewLine() {
 System.out.println();
 }

 public void printString(String value) {
 System.out.print(value);
 }

 public void printInteger(int value) {
 System.out.print(value);
 }

 public void printBoolean(boolean value) {
 System.out.print(value);
 }
 
 public void scanNewLine() {
 // to-do: ...
 }
 
 public void scanString(String value) {
 // to-do: ...
 }

 public void scanInteger(int value) {
 // to-do: ...
 }

 public void scanBoolean(boolean value) {
 // to-do: ...
 }
 
 // ...
 
}

```

##### Իրականացում

```
import consoles;

class ConsoleDemo {
 public static MainModule console = null;

 public static void prepare() {
 console = MainModule.getSingleton();

 console.prepare();
 }

 public static void unprepare() {
 console.unprepare();
 }

 public static void execute(String[] args) {
 console.printString("Hello World");
 console.printNewLine();
 console.scanNewLine();
 }

 public static void main(String[] args) {
 prepare();
 execute(args);
 unprepare();
 }
}

```

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * դ
* ք
* խ
Նախագծման ձևանմուշներ |
| --- |
|  |
| ԳօՖիձևանմուշներ | 

|  |  |
| --- | --- |
| Ստեղծող | Աբստրակտ ֆաբրիկա • Կառուցող • Ֆաբրիկային մեթոդ • Նախատիպ • Եզակի օգտագործման |
| Կառուցվածքային | Ադապտեր • Կամուրջ • Կազմող • Դեկորատոր • Ճակատ • Հարմարեցնող • Պրոքսի |
| Վարքագծային | Պարտականությունների շղթա • Հրաման • Թարգմանիչ • Իտերատոր • Միջնորդ • Պահպանող • Դիտորդ • Վիճակ • Մարտավարություն • Կաղապարային մեթոդ • Այցելող |

 |
|  |
| Ստեղծող ձևանմուշներ | Ծույլ բեռնում • Բազմակի օգտագործման • Օբյեկտների ավազան • Ռեսուրսի ստանալը ինիցիալիզացիա է |
|  |
| Կառուցվածքային ձևանմուշներ | Ճակատը հսկող • Մոդուլ |
|  |
| Համաձայնեցման ձևանմուշներ | Ակտիվ օբյեկտ • Հենվող • Մեկուսացում կրկնակի ստուգումով • Ասինքրոն կանչի մեթոդ • Պահպանվող կախոց • Ռեգիստրացնող • Կողպեքավորող • Մոնիտոր • Նախագործող • Ապագործող • Ընթերցողներ-գրողի կողպեք • Պլանավորման • Հոսքերի ավազանի • Հոսքերի լոկալ հիշողություն |
|  |
| Ճարտարապետական ձևանմուշներ | Ճակատը հսկող ձևանմուշ • Զավթող ձևանմուշ • ձևանմուշի ներկայացման վերահսկում • Բազմաշերտ • Հատկորոշում • Հրատարակող-ստորագրող • Մերկ օբյեկտներ • Ծառայության լոկատոր • Ակտիվ գրառման • Բազմության իդենտիֆիկացման • Data access object • Data transfer object |
|  |
| Այլ ձևանմուշներ | Կախվածության ներդնում • Mock օբյեկտ • Զրոյական օբյեկտ • Ծառայող • Թունելային տարատեսակի |

 |