Object-oriented design is founded on a solid technical basis, the pieces of which we refer to collectively as the object model. The principles of abstraction, encapsulation, modularity, hierarchy, typing, concurrency, and persistence are all incorporated into the object model. In fact, these are the only ways in which software can be built correctly. The object model consists of three main parts: classes, objects, and relationships. A class is a template that defines the general nature of something such as an operation or a piece of data. Classes cannot themselves be instantiated, but rather contain methods that can be invoked to create new instances of themselves or other classes. These are called constructors. Objects are real things that exist in the world outside of our computers. They are defined by their class names and can participate in relationships with other objects. Relationships are connections between objects. They can be one to many (one object has many properties) or many to many (many objects may have mutual relations). There are two types of relationships: symmetric and asymmetric. A symmetric relationship is one where both parties can affect each other; for example, father and son, friend - friend. An asymmetric relationship is one where only one party can affect the other; for example, employer-employee. Relationships are important in object-oriented programming because they allow objects to communicate with each other.