Software Design and Architecture - Chapter 01
Software Design and Architecture - Chapter 01
Software Design and Architecture - Chapter 01
Forward Engineering:
Forward Engineering is a method of creating or making an application with the help of the given
requirements. Forward engineering is also known as Renovation and Reclamation. Forward
engineering is required high proficiency skill. It takes more time to construct or develop an
application.
Reverse Engineering:
Reverse Engineering is also known as backward engineering, is the process of forward
engineering in reverse. In this, the information are collected from the given or exist application. It
takes less time than forward engineering to develop an application. In reverse engineering the
application are broken to extract knowledge or its architecture.
Design Patterns
Design patterns represent the best practices used by experienced object-oriented software
developers. Design patterns are solutions to general problems that software developers faced
during software development. These solutions were obtained by trial and error by numerous
software developers over quite a substantial period of time.
This tutorial will take you through step by step approach and examples using Java while learning
Design Pattern concepts.
In 1994, four authors Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides published
a book titled Design Patterns - Elements of Reusable Object-Oriented Software which initiated
the concept of Design Pattern in Software development.
These authors are collectively known as Gang of Four (GOF). According to these authors design
patterns are primarily based on the following principles of object orientated design.
Program to an interface not an implementation
Favour object composition over inheritance
Best Practices
Design patterns have been evolved over a long period of time and they provide best solutions to
certain problems faced during software development. Learning these patterns helps
inexperienced developers to learn software design in an easy and faster way.
As per the design pattern reference book Design Patterns - Elements of Reusable Object-
Oriented Software , there are 23 design patterns which can be classified in three categories:
Creational, Structural and Behavioural patterns. We'll also discuss another category of design
pattern: J2EE design patterns.
1 Creational Patterns
These design patterns provide a way to create objects while hiding the
creation logic, rather than instantiating objects directly using new operator.
This gives program more flexibility in deciding which objects need to be
created for a given use case.
2 Structural Patterns
These design patterns concern class and object composition. Concept of
inheritance is used to compose interfaces and define ways to compose
objects to obtain new functionalities.
3 Behavioural Patterns
These design patterns are specifically concerned with communication
between objects.
4 J2EE Patterns
These design patterns are specifically concerned with the presentation tier.
These patterns are identified by Sun Java Centre.
Factory Pattern
Factory pattern is one of the most used design patterns in Java. This type of design pattern
comes under creational pattern as this pattern provides one of the best ways to create an object.
In Factory pattern, we create object without exposing the creation logic to the client and refer to
newly created object using a common interface.
Implementation
Step 1
Create an interface.
Shape.java
public interface Shape {
void draw();
}
Step 2
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
Square.java
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
Circle.java
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
Step 3
} else if(shapeType.equalsIgnoreCase("RECTANGLE")){
return new Rectangle();
} else if(shapeType.equalsIgnoreCase("SQUARE")){
return new Square();
}
return null;
}
}
Step 4
Use the Factory to get object of concrete class by passing an information such as type.
FactoryPatternDemo.java
public class FactoryPatternDemo {
Step 5
Singleton Pattern
Singleton pattern is one of the simplest design patterns in Java. This type of design pattern
comes under creational pattern as this pattern provides one of the best ways to create an object.
This pattern involves a single class which is responsible to create an object while making sure
that only single object gets created. This class provides a way to access its only object which can
be accessed directly without need to instantiate the object of the class.
Implementation
Step 2
//illegal construct
//Compile Time Error: The constructor SingleObject() is not visible
//SingleObject object = new SingleObject();
Step 3
Builder Pattern
Builder pattern builds a complex object using simple objects and using a step by step approach.
This type of design pattern comes under creational pattern as this pattern provides one of the
best ways to create an object.
A Builder class builds the final object step by step. This builder is independent of other objects.
Implementation
We have considered a business case of fast-food restaurant where a typical meal could be a
burger and a cold drink. Burger could be either a Veg Burger or Chicken Burger and will be
packed by a wrapper. Cold drink could be either a coke or pepsi and will be packed in a bottle.
We are going to create an Item interface representing food items such as burgers and cold drinks
and concrete classes implementing the Item interface and a Packing interface representing
packaging of food items and concrete classes implementing the Packing interface as burger
would be packed in wrapper and cold drink would be packed as bottle.
We then create a Meal class having ArrayList of Item and a MealBuilder to build different types
of Meal objects by combining Item. BuilderPatternDemo, our demo class will use MealBuilder to
build a Meal.
Step 1
Step 2
@Override
public String pack() {
return "Wrapper";
}
}
Bottle.java
public class Bottle implements Packing {
@Override
public String pack() {
return "Bottle";
}
}
Step 3
Create abstract classes implementing the item interface providing default functionalities.
Burger.java
public abstract class Burger implements Item {
@Override
public Packing packing() {
return new Wrapper();
}
@Override
public abstract float price();
}
ColdDrink.java
public abstract class ColdDrink implements Item {
@Override
public Packing packing() {
return new Bottle();
}
@Override
public abstract float price();
}
Step 4
@Override
public float price() {
return 25.0f;
}
@Override
public String name() {
return "Veg Burger";
}
}
ChickenBurger.java
public class ChickenBurger extends Burger {
@Override
public float price() {
return 50.5f;
}
@Override
public String name() {
return "Chicken Burger";
}
}
Coke.java
public class Coke extends ColdDrink {
@Override
public float price() {
return 30.0f;
}
@Override
public String name() {
return "Coke";
}
}
Pepsi.java
public class Pepsi extends ColdDrink {
@Override
public float price() {
return 35.0f;
}
@Override
public String name() {
return "Pepsi";
}
}
Step 5
Step 6
Create a MealBuilder class, the actual builder class responsible to create Meal objects.
MealBuilder.java
public class MealBuilder {
Step 7
BuiderPatternDemo uses MealBuider to demonstrate builder pattern.
BuilderPatternDemo.java
public class BuilderPatternDemo {
public static void main(String[] args) {
Step 8
Non-Veg Meal
Item : Chicken Burger, Packing : Wrapper, Price : 50.5
Item : Pepsi, Packing : Bottle, Price : 35.0
Total Cost: 85.5
MVC Pattern
MVC Pattern stands for Model-View-Controller Pattern. This pattern is used to separate
application's concerns.
Model - Model represents an object or JAVA POJO carrying data. It can also have logic to
update controller if its data changes.
View - View represents the visualization of the data that model contains.
Controller - Controller acts on both model and view. It controls the data flow into model
object and updates the view whenever data changes. It keeps view and model separate.
Implementation
We are going to create a Student object acting as a model.StudentView will be a view class
which can print student details on console and StudentController is the controller class
responsible to store data in Student object and update view StudentView accordingly.
MVCPatternDemo, our demo class, will use StudentController to demonstrate use of MVC
pattern.
Step 1
Create Model.
Student.java
public class Student {
private String rollNo;
private String name;
Step 2
Create View.
StudentView.java
public class StudentView {
public void printStudentDetails(String studentName, String studentRollNo){
System.out.println("Student: ");
System.out.println("Name: " + studentName);
System.out.println("Roll No: " + studentRollNo);
}
}
Step 3
Create Controller.
StudentController.java
public class StudentController {
private Student model;
private StudentView view;
Step 4
controller.updateView();
controller.updateView();
}
Step 5
We are seeking a highly skilled software architect to lead our development team in creating software
solutions that meet our clients' needs. You will be responsible for communicating with clients to
determine their requirements, creating comprehensive solution plans, and leading a team of software
engineers as they develop polished final products.
To be successful as a software architect, you should be an expert problem solver with a strong
understanding of the broad range of software technologies and platforms available. Top candidates
will also be excellent leaders and communicators.
Software Architect Responsibilities:
Architect System
Strategic thinking Communication Design
type interactions
solutions
focused on solution very detailed multiple teams detailed
architect