implemented factory pattern

This commit is contained in:
ismayilmalik 2018-01-02 22:08:52 +03:00
parent 8f5f035a6f
commit 82090ab827
2 changed files with 84 additions and 0 deletions

View 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))
}
}

View 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.")
}
}