Vala
design-patterns-for-humans in Vala (programming language)
Install / Use
/learn @design-patterns-for-humans/ValaREADME

<p align="center"> 🎉 Ultra-simplified explanation to design patterns! 🎉 </p> <p align="center"> A topic that can easily make anyone's mind wobble. Here I try to make them stick in to your mind (and maybe mine) by explaining them in the <i>simplest</i> way possible. </p>
🚀 Introduction
Design patterns are solutions to recurring problems; guidelines on how to tackle certain problems. They are not classes, packages or libraries that you can plug into your application and wait for the magic to happen. These are, rather, guidelines on how to tackle certain problems in certain situations.
Design patterns are solutions to recurring problems; guidelines on how to tackle certain problems
Wikipedia describes them as
In software engineering, a software design pattern is a general reusable solution to a commonly occurring problem within a given context in software design. It is not a finished design that can be transformed directly into source or machine code. It is a description or template for how to solve a problem that can be used in many different situations.
⚠️ Be Careful
- Design patterns are not a silver bullet to all your problems.
- Do not try to force them; bad things are supposed to happen, if done so. Keep in mind that design patterns are solutions to problems, not solutions finding problems; so don't overthink.
- If used in a correct place in a correct manner, they can prove to be a savior; or else they can result in a horrible mess of a code.
Also note that the code samples below are in Vala, however this shouldn't stop you because the concepts are same anyways. Plus the support for other languages is underway.
Types of Design Patterns
Creational Design Patterns
In plain words
Creational patterns are focused towards how to instantiate an object or group of related objects.
Wikipedia says
In software engineering, creational design patterns are design patterns that deal with object creation mechanisms, trying to create objects in a manner suitable to the situation. The basic form of object creation could result in design problems or added complexity to the design. Creational design patterns solve this problem by somehow controlling this object creation.
🏠 Simple Factory
Real world example
Consider, you are building a house and you need doors. It would be a mess if every time you need a door, you put on your carpenter clothes and start making a door in your house. Instead you get it made from a factory.
In plain words
Simple factory simply generates an instance for client without exposing any instantiation logic to the client
Wikipedia says
In object-oriented programming (OOP), a factory is an object for creating other objects – formally a factory is a function or method that returns objects of a varying prototype or class from some method call, which is assumed to be "new".
Programmatic Example
First of all we have a door interface and the implementation
interface Door : Object {
public abstract float get_width ();
public abstract float get_height ();
}
class WoodenDoor: Object, Door {
protected float width;
protected float height;
public WoodenDoor (float width, float height) {
this.width = width;
this.height = height;
}
public float get_width () {
return width;
}
public float get_height () {
return height;
}
}
Then we have our door factory that makes the door and returns it
class DoorFactory {
public static Door make_door (float width, float height) {
return new WoodenDoor (width, height);
}
}
And then it can be used as
var door = DoorFactory.make_door (100,200);
print ("width: %f\n", door.get_width ());
print ("height: %f\n", door.get_height ());
When to Use?
When creating an object is not just a few assignments and involves some logic, it makes sense to put it in a dedicated factory instead of repeating the same code everywhere.
🏭 Factory Method
Real world example
Consider the case of a hiring manager. It is impossible for one person to interview for each of the positions. Based on the job opening, she has to decide and delegate the interview steps to different people.
In plain words
It provides a way to delegate the instantiation logic to child classes.
Wikipedia says
In class-based programming, the factory method pattern is a creational pattern that uses factory methods to deal with the problem of creating objects without having to specify the exact class of the object that will be created. This is done by creating objects by calling a factory method—either specified in an interface and implemented by child classes, or implemented in a base class and optionally overridden by derived classes—rather than by calling a constructor.
Programmatic Example
Taking our hiring manager example above. First of all we have an interviewer interface and some implementations for it
interface Interviewer : Object {
public abstract void ask_questions ();
}
class Developer : Object, Interviewer {
public void ask_questions () {
print ("Asking questions about patterns!\n");
}
}
class CommunityExecutive : Object, Interviewer {
public void ask_questions () {
print ("Asking questions about community building.\n");
}
}
Now let us create our HiringManager
abstract class HiringManager {
// Factory Method
public abstract Interviewer make_interviewer ();
public void take_interview () {
var interviewer = this.make_interviewer ();
interviewer.ask_questions ();
}
}
Now any child can extend it and provide the required interviewer
class DevelopmentManager : HiringManager {
public override Interviewer make_interviewer () {
return new Developer ();
}
}
class MarketingManager : HiringManager {
public override Interviewer make_interviewer () {
return new CommunityExecutive ();
}
}
and then it can be used as
var dev_manager = new DevelopmentManager ();
dev_manager.take_interview (); // Output: Asking about design patterns
var marketing_manager = new MarketingManager ();
marketing_manager.take_interview (); // Output: Asking about community building
When to use?
Useful when there is some generic processing in a class but the required sub-class is dynamically decided at runtime. Or putting it in other words, when the client doesn't know what exact sub-class it might need.
🔨 Abstract Factory
Real world example
Extending our door example from Simple Factory. Based on your needs you might get a wooden door from a wooden door shop, iron door from an iron shop or a PVC door from the relevant shop. Plus you might need a guy with different kind of specialities to fit the door, for example a carpenter for wooden door, welder for iron door etc. As you can see there is a dependency between the doors now, wooden door needs carpenter, iron door needs a welder etc.
In plain words
A factory of factories; a factory that groups the individual but related/dependent factories together without specifying their concrete classes.
Wikipedia says
The abstract factory pattern provides a way to encapsulate a group of individual factories that have a common theme without specifying their concrete classes
Programmatic Example
Translating the door example above. First of all we have our Door interface and some implementation for it
interface Door : Object {
public abstract void get_description ();
}
class WoodenDoor : Object, Door {
public void get_description () {
print ("I'm a wooden door\n");
}
}
class IronDoor : Object, Door {
public void get_description () {
print ("I'm a iron door\n");
}
}
Then we have some fitting experts for each door type
interface DoorFittingExpert : Object {
public abstract void get_description ();
}
class Welder : Object, DoorFittingExpert {
public void get_description () {
print ("I can only fit iron doors\n");
}
}
class Carpenter : Object, DoorFittingExpert {
public void get_description () {
print ("I can only fit wooden doors\n");
}
}
Now we have our abstract factory that would let us make family of related objects i.e. wooden door factory would create a wooden door and wooden door fitting expert and iron door factory would create an iron door and iron door fitting expert
interface DoorFactory : Object {
public abstract Door make_door ();
public abstract DoorFittingExpert make_fitting_expert ();
}
// Wooden factory to return carpenter and wooden door
class WoodenDoorFactory : Object, DoorFactory {
public Door make_door () {
return new WoodenDoor ();
}
public DoorFittingExpert make_fitting_expert () {
return new Carpenter ();
}
}
// Iron door factory to get iron door and the relevant fitting expert
class IronDoorFactory : Object, DoorFactory {
public Door make_door () {
return new IronDoor ();
}
public DoorFittingExpert make_fitting_expert () {
return new Welder ();
}
}
And then it can be used as
var wooden_factory = new WoodenDoorFactory ();
var door = wooden_factory.make_door ();
var expert = wooden_factory.make_fitting_expert ();
door.get_description (); // Outpu
Related Skills
diffs
342.0kUse the diffs tool to produce real, shareable diffs (viewer URL, file artifact, or both) instead of manual edit summaries.
openpencil
1.9kThe world's first open-source AI-native vector design tool and the first to feature concurrent Agent Teams. Design-as-Code. Turn prompts into UI directly on the live canvas. A modern alternative to Pencil.
ui-ux-pro-max-skill
55.3kAn AI SKILL that provide design intelligence for building professional UI/UX multiple platforms
ui-ux-pro-max-skill
55.3kAn AI SKILL that provide design intelligence for building professional UI/UX multiple platforms
Security Score
Audited on Feb 25, 2026
