implemented factory pattern
This commit is contained in:
		
							
								
								
									
										42
									
								
								creational/factory/factory.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								creational/factory/factory.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
			
		||||
package factory
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	SMS   = 1
 | 
			
		||||
	Email = 2
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Notification struct {
 | 
			
		||||
	To      string
 | 
			
		||||
	Message string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Notifier interface {
 | 
			
		||||
	SendNotification(Notification) string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type SMSNotification struct{}
 | 
			
		||||
func (n SMSNotification) SendNotification(notification Notification) string {
 | 
			
		||||
	return fmt.Sprintf("`%s` was sent to number `%s` successfully!", notification.Message, notification.To)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type EmailNotification struct{}
 | 
			
		||||
func (n EmailNotification) SendNotification(notification Notification) string {
 | 
			
		||||
	return fmt.Sprintf("`%s` was sent to email `%s` successfully!", notification.Message, notification.To)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Factory .....
 | 
			
		||||
func GetNotifier(notifierType int) (Notifier, error) {
 | 
			
		||||
	switch notifierType {
 | 
			
		||||
		case SMS:
 | 
			
		||||
			return new(SMSNotification), nil
 | 
			
		||||
		case Email:
 | 
			
		||||
			return new(EmailNotification), nil
 | 
			
		||||
		default:
 | 
			
		||||
		return nil, errors.New(fmt.Sprintf("Notifier type %d not recognized.", notifierType))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										42
									
								
								creational/factory/factory_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								creational/factory/factory_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
			
		||||
package factory
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"strings"
 | 
			
		||||
	"testing"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestGetSMSNotifier(t *testing.T)  {
 | 
			
		||||
	notification := Notification{"5552233", "Hello world!"}
 | 
			
		||||
	notifier, err := GetNotifier(SMS)
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal("Notifier type 'SMS' must be returned")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	resultStr := notifier.SendNotification(notification)
 | 
			
		||||
	if !strings.Contains(resultStr, "was sent to number") {
 | 
			
		||||
		t.Error("SMS notifier result message was not correct.")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestGetEmailNotifier(t *testing.T)  {
 | 
			
		||||
	notification := Notification{"5552233", "Hello world!"}
 | 
			
		||||
	notifier, err := GetNotifier(Email)
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal("Notifier type 'Email' must be returned")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	resultStr := notifier.SendNotification(notification)
 | 
			
		||||
	if !strings.Contains(resultStr, "was sent to email") {
 | 
			
		||||
		t.Error("Email notifier result message was not correct.")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestGetNonExistanceNotifier(t *testing.T)  {
 | 
			
		||||
	_, err := GetNotifier(3)
 | 
			
		||||
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		t.Fatal("Error must be returned for unrecognized notifier type.")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user