1- namespace AbstractFactoryPattern {
2- export interface AbstractProductA {
3- methodA ( ) : string ;
4- }
5- export interface AbstractProductB {
6- methodB ( ) : number ;
7- }
8-
9- export interface AbstractFactory {
10- createProductA ( param ?: any ) : AbstractProductA ;
11- createProductB ( ) : AbstractProductB ;
12- }
13-
14-
15- export class ProductA1 implements AbstractProductA {
16- methodA = ( ) => {
17- return "This is methodA of ProductA1" ;
18- }
19- }
20- export class ProductB1 implements AbstractProductB {
21- methodB = ( ) => {
22- return 1 ;
23- }
24- }
25-
26- export class ProductA2 implements AbstractProductA {
27- methodA = ( ) => {
28- return "This is methodA of ProductA2" ;
29- }
30- }
31- export class ProductB2 implements AbstractProductB {
32- methodB = ( ) => {
33- return 2 ;
34- }
35- }
36-
37-
38- export class ConcreteFactory1 implements AbstractFactory {
39- createProductA ( param ?: any ) : AbstractProductA {
40- return new ProductA1 ( ) ;
41- }
42-
43- createProductB ( param ?: any ) : AbstractProductB {
44- return new ProductB1 ( ) ;
45- }
46- }
47- export class ConcreteFactory2 implements AbstractFactory {
48- createProductA ( param ?: any ) : AbstractProductA {
49- return new ProductA2 ( ) ;
50- }
51-
52- createProductB ( param ?: any ) : AbstractProductB {
53- return new ProductB2 ( ) ;
54- }
55- }
56-
57-
58- export class Tester {
59- private abstractProductA : AbstractProductA ;
60- private abstractProductB : AbstractProductB ;
61-
62- constructor ( factory : AbstractFactory ) {
63- this . abstractProductA = factory . createProductA ( ) ;
64- this . abstractProductB = factory . createProductB ( ) ;
65- }
66-
67- public test ( ) : void {
68- console . log ( this . abstractProductA . methodA ( ) ) ;
69- console . log ( this . abstractProductB . methodB ( ) ) ;
70- }
71- }
72-
73- }
74-
75- ( function main ( ) {
76-
77- // Abstract factory1
78- var factory1 : AbstractFactoryPattern . AbstractFactory = new AbstractFactoryPattern . ConcreteFactory1 ( ) ;
79- var tester1 : AbstractFactoryPattern . Tester = new AbstractFactoryPattern . Tester ( factory1 ) ;
80- tester1 . test ( ) ;
81-
82- // Abstract factory2
83- var factory2 : AbstractFactoryPattern . AbstractFactory = new AbstractFactoryPattern . ConcreteFactory2 ( ) ;
84- var tester2 : AbstractFactoryPattern . Tester = new AbstractFactoryPattern . Tester ( factory2 ) ;
85- tester2 . test ( ) ;
86-
87- } ( ) ) ;
1+ namespace AbstractFactoryPattern {
2+ export interface AbstractProductA {
3+ methodA ( ) : string ;
4+ }
5+ export interface AbstractProductB {
6+ methodB ( ) : number ;
7+ }
8+
9+ export interface AbstractFactory {
10+ createProductA ( param ?: any ) : AbstractProductA ;
11+ createProductB ( ) : AbstractProductB ;
12+ }
13+
14+
15+ export class ProductA1 implements AbstractProductA {
16+ methodA = ( ) => {
17+ return "This is methodA of ProductA1" ;
18+ }
19+ }
20+ export class ProductB1 implements AbstractProductB {
21+ methodB = ( ) => {
22+ return 1 ;
23+ }
24+ }
25+
26+ export class ProductA2 implements AbstractProductA {
27+ methodA = ( ) => {
28+ return "This is methodA of ProductA2" ;
29+ }
30+ }
31+ export class ProductB2 implements AbstractProductB {
32+ methodB = ( ) => {
33+ return 2 ;
34+ }
35+ }
36+
37+
38+ export class ConcreteFactory1 implements AbstractFactory {
39+ createProductA ( param ?: any ) : AbstractProductA {
40+ return new ProductA1 ( ) ;
41+ }
42+
43+ createProductB ( param ?: any ) : AbstractProductB {
44+ return new ProductB1 ( ) ;
45+ }
46+ }
47+ export class ConcreteFactory2 implements AbstractFactory {
48+ createProductA ( param ?: any ) : AbstractProductA {
49+ return new ProductA2 ( ) ;
50+ }
51+
52+ createProductB ( param ?: any ) : AbstractProductB {
53+ return new ProductB2 ( ) ;
54+ }
55+ }
56+
57+
58+ export class Tester {
59+ private abstractProductA : AbstractProductA ;
60+ private abstractProductB : AbstractProductB ;
61+
62+ constructor ( factory : AbstractFactory ) {
63+ this . abstractProductA = factory . createProductA ( ) ;
64+ this . abstractProductB = factory . createProductB ( ) ;
65+ }
66+
67+ public test ( ) : void {
68+ console . log ( this . abstractProductA . methodA ( ) ) ;
69+ console . log ( this . abstractProductB . methodB ( ) ) ;
70+ }
71+ }
72+
73+ }
0 commit comments