mirror of
https://github.com/crazybber/awesome-patterns.git
synced 2024-11-24 13:36:03 +03:00
Abstract factory pattern
This commit is contained in:
parent
61fd1de9d7
commit
ecef7a4803
BIN
channel/basic/debug
Executable file
BIN
channel/basic/debug
Executable file
Binary file not shown.
5
creational/abstract_factory/car.go
Normal file
5
creational/abstract_factory/car.go
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
type Car interface {
|
||||||
|
NumDoors() int
|
||||||
|
}
|
24
creational/abstract_factory/car_factory.go
Normal file
24
creational/abstract_factory/car_factory.go
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
LuxuryCarType = 1
|
||||||
|
FamilyCarType = 2
|
||||||
|
)
|
||||||
|
|
||||||
|
type CarFactory struct{}
|
||||||
|
|
||||||
|
func (c *CarFactory) NewVehicle(v int) (Vehicle, error) {
|
||||||
|
switch v {
|
||||||
|
case LuxuryCarType:
|
||||||
|
return new(LuxuryCar), nil
|
||||||
|
case FamilyCarType:
|
||||||
|
return new(FamilyCar), nil
|
||||||
|
default:
|
||||||
|
return nil, errors.New(fmt.Sprintf("Vehicle of type %d not exist\n", v))
|
||||||
|
}
|
||||||
|
}
|
15
creational/abstract_factory/cruise_motorbike.go
Normal file
15
creational/abstract_factory/cruise_motorbike.go
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
type CruiseMotorbike struct{}
|
||||||
|
|
||||||
|
func (s *CruiseMotorbike) NumWheels() int {
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *CruiseMotorbike) NumSeats() int {
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *CruiseMotorbike) GetMotorbikeType() int {
|
||||||
|
return CruiseMotorbikeType
|
||||||
|
}
|
15
creational/abstract_factory/family_car.go
Normal file
15
creational/abstract_factory/family_car.go
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
type FamilyCar struct{}
|
||||||
|
|
||||||
|
func (*FamilyCar) NumDoors() int {
|
||||||
|
return 5
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*FamilyCar) NumWheels() int {
|
||||||
|
return 4
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*FamilyCar) NumSeats() int {
|
||||||
|
return 5
|
||||||
|
}
|
15
creational/abstract_factory/luxury_car.go
Normal file
15
creational/abstract_factory/luxury_car.go
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
type LuxuryCar struct{}
|
||||||
|
|
||||||
|
func (*LuxuryCar) NumDoors() int {
|
||||||
|
return 4
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*LuxuryCar) NumWheels() int {
|
||||||
|
return 4
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*LuxuryCar) NumSeats() int {
|
||||||
|
return 5
|
||||||
|
}
|
@ -9,3 +9,5 @@ package main
|
|||||||
|
|
||||||
// Objectives: Grouping related families of objects is very convenient when your object number is growing so much that
|
// Objectives: Grouping related families of objects is very convenient when your object number is growing so much that
|
||||||
// creating a unique point to get them all seems the only way to gain the flexible of runtime object creation.
|
// creating a unique point to get them all seems the only way to gain the flexible of runtime object creation.
|
||||||
|
|
||||||
|
|
||||||
|
5
creational/abstract_factory/motorbike.go
Normal file
5
creational/abstract_factory/motorbike.go
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
type Motorbike interface {
|
||||||
|
GetMotorbikeType() int
|
||||||
|
}
|
24
creational/abstract_factory/motorbike_factory.go
Normal file
24
creational/abstract_factory/motorbike_factory.go
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
SportMotorbikeType = 1
|
||||||
|
CruiseMotorbikeType = 2
|
||||||
|
)
|
||||||
|
|
||||||
|
type MotorbikeFactory struct{}
|
||||||
|
|
||||||
|
func (m *MotorbikeFactory) Build(v int) (Vehicle, error) {
|
||||||
|
switch v {
|
||||||
|
case SportMotorbikeType:
|
||||||
|
return new(SportMotorbike), nil
|
||||||
|
case CruiseMotorbikeType:
|
||||||
|
return new(CruiseMotorbike), nil
|
||||||
|
default:
|
||||||
|
return nil, errors.New(fmt.Sprintf("Motor bike of type %d not exist\n", v))
|
||||||
|
}
|
||||||
|
}
|
15
creational/abstract_factory/sport_motorbike.go
Normal file
15
creational/abstract_factory/sport_motorbike.go
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
type SportMotorbike struct{}
|
||||||
|
|
||||||
|
func (s *SportMotorbike) NumWheels() int {
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SportMotorbike) NumSeats() int {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SportMotorbike) GetMotorbikeType() int {
|
||||||
|
return SportMotorbikeType
|
||||||
|
}
|
6
creational/abstract_factory/vehicle.go
Normal file
6
creational/abstract_factory/vehicle.go
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
type Vehicle interface {
|
||||||
|
NumWheels() int
|
||||||
|
NumSeats() int
|
||||||
|
}
|
5
creational/abstract_factory/vehicle_factory.go
Normal file
5
creational/abstract_factory/vehicle_factory.go
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
type VehicleFactory interface {
|
||||||
|
NewVehicle(v int) (Vehicle, error)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user