Skip to main content

Command Palette

Search for a command to run...

Golang - Facade Pattern

It's all just a facade

Updated
2 min read
Golang - Facade Pattern
M

Senior Freelancer & Technical Lead

Working as a Golang developer since 2020. Working as a mobile developer since 2013.

Focussed on architecture, testability and clean code. Open minded & product driven. Based in Rhede, available world-wide

In software engineering, the Facade Pattern is a structural pattern that provides a simplified interface to a larger body of code. It's used to make a complex system more accessible, easier to use, and more understandable for end-users. The Facade Pattern is part of the "Gang of Four" design patterns that describe the best practices for object-oriented software development.

How the Facade Pattern Works

The Facade Pattern provides a unified interface to a set of interfaces in a subsystem. It defines a higher-level interface that makes the subsystem easier to use. The subsystem can be a complex set of classes or a library that performs a specific task. The Facade Pattern is used to hide the complexities of the subsystem and provide a simplified interface to the end-user.

Code Example

Here's an example of how the Facade Pattern can be used in Golang:

package main

import (
    "fmt"
)

type CPU struct{}

func (*CPU) Freeze() {
    fmt.Println("CPU Freeze")
}

func (*CPU) Jump(position int) {
    fmt.Printf("CPU Jump to %d\n", position)
}

func (*CPU) Execute() {
    fmt.Println("CPU Execute")
}

type Memory struct{}

func (*Memory) Load(position int, data string) {
    fmt.Printf("Memory Load data '%s' to position %d\n", data, position)
}

type HardDrive struct{}

func (*HardDrive) Read(position int, size int) string {
    data := fmt.Sprintf("HardDrive Read data from position %d with size %d", position, size)
    fmt.Println(data)
    return data
}

type ComputerFacade struct {
    cpu       *CPU
    memory    *Memory
    hardDrive *HardDrive
}

func NewComputerFacade() *ComputerFacade {
    return &ComputerFacade{
        cpu:       &CPU{},
        memory:    &Memory{},
        hardDrive: &HardDrive{},
    }
}

func (c *ComputerFacade) Start() {
    c.cpu.Freeze()
    c.memory.Load(0, "boot_loader")
    c.cpu.Jump(0)
    c.cpu.Execute()
}

func main() {
    computer := NewComputerFacade()
    computer.Start()
}

In the example above, we have a ComputerFacade that provides a simplified interface to a set of subsystems such as CPU, Memory, and HardDrive. The Start method of the ComputerFacade performs a series of actions that are required to start a computer. The end-user only needs to call the Start method to start the computer, and the ComputerFacade takes care of the complexities of the subsystems.

Conclusion

The Facade Pattern is a useful pattern for simplifying complex systems and making them more accessible to end-users. It provides a unified interface to a set of interfaces in a subsystem, making it easier to use and understand. In Golang, the Facade Pattern can be used to simplify the interaction with complex libraries or sets of classes.


References

Golang Patterns

Part 10 of 19

Welcome to the Golang Patterns tutorial series! In this series, we will explore the various software patterns that can be applied in Golang to create flexible, scalable, and maintainable software.

Up next

Golang - Command Pattern

The "Command Pattern" is one of the design patterns introduced by the "Gang of Four". This pattern is used to encapsulate the request as an object and allows you to parameterize clients with different requests, queue or log requests, and support undo...

Golang - Facade Pattern