Sei sulla pagina 1di 13

What is a software design pattern?

In software engineering, a design pattern is a general repeatable solution to a


commonly occurring problem in software design. A design pattern isn't a finished design
that can be transformed directly into code. It is a description or template for how to solve
a problem that can be used in many different situations.

Design patterns can be categorised into three fundamental groups, as follows:-


1. Structural Patterns
2. Creational Patterns
3. Behavioral Patterns
Let's see in detail each of the patterns:

Creational design patterns

These design patterns are all about class instantiation. This pattern can be further
divided into class-creation patterns and object-creational patterns. While class-creation
patterns use inheritance effectively in the instantiation process, object-creation patterns
use delegation effectively to get the job done.

 Abstract Factory
Creates an instance of several families of classes
 Builder
Separates object construction from its representation
 Factory Method
Creates an instance of several derived classes
 Object Pool
Avoid expensive acquisition and release of resources by recycling objects that
are no longer in use
 Prototype
A fully initialized instance to be copied or cloned
 Singleton
A class of which only a single instance can exist

Structural design patterns

These design patterns are all about Class and Object composition. Structural class-
creation patterns use inheritance to compose interfaces. Structural object-patterns
define ways to compose objects to obtain new functionality.

 Adapter : Match interfaces of different classes


 Bridge : Separates an object’s interface from its implementation
 Composite : A tree structure of simple and composite objects
 Decorator : Add responsibilities to objects dynamically
 Facade : A single class that represents an entire subsystem
 Flyweight : A fine-grained instance used for efficient sharing
 Private Class Data : Restricts accessor/mutator access
 Proxy : An object representing another object

Behavioral design patterns

These design patterns are all about Class's objects communication. Behavioral patterns
are those patterns that are most specifically concerned with communication between
objects.

 Chain of responsibility : A way of passing a request between a chain of objects


 Command : Encapsulate a command request as an object
 Interpreter : A way to include language elements in a program
 Iterator : Sequentially access the elements of a collection
 Mediator : Defines simplified communication between classes
 Memento : Capture and restore an object's internal state
 Null Object : Designed to act as a default value of an object
 Observer : A way of notifying change to a number of classes
 State : Alter an object's behavior when its state changes
 Strategy : Encapsulates an algorithm inside a class
 Template method : Defer the exact steps of an algorithm to a subclass
 Visitor : Defines a new operation to a class without change

Why do we need design patterns?

Firstly, software design patterns provide us with a way to solve issues related to software
development using a proven solution. software design patterns are distilled from
experience and are formalization of ideas from software engineers over many years.
People derived these patterns after they made lots of mistakes. So, using design
patterns helps us get away from mistakes. Since they isolate the variability that may exist
in the system requirements, using them leads to maintainable, flexible and extendable
codes. When we have repeated codes and we want to increase the efficiency, we could
apply a suitable software design pattern, for example, doing the refactoring process to
reduce repeated codes and thus making ours codes more general. Secondly, design
patterns are communication tools. Other people who know the pattern your project used
will understand your codes very quickly. So, using design patterns makes the
communication between software engineers more efficient.

Advantages and disadvantages of design pattern?


Advantages of design pattern:

1. They are reusable in multiple projects.


2. They provide the solutions that help to define the system architecture.
3. They capture the software engineering experiences.
4. They provide transparency to the design of an application.
5. They are well-proved and testified solutions since they have been built upon the
knowledge and experience of expert software developers.
6. Design patterns don't guarantee an absolute solution to a problem. They provide
clarity to the system architecture and the possibility of building a better system.

Disadvantages of design pattern

1. Do not lead to direct code reuse


2. Makes code more difficult to read as all of your code is behind an abstraction
that may in turn hide abstractions.

Singleton Design 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
We're going to create a SingleObject class. SingleObject class have its constructor as
private and have a static instance of itself.

SingleObject class provides a static method to get its static instance to outside
world. SingletonPatternDemo, our demo class will use SingleObject class to get
a SingleObject object.
Step 1
Create a Singleton Class.

SingleObject.java

public class SingleObject {


//create an object of SingleObject
private static SingleObject instance = new SingleObject();
//make the constructor private so that this class cannot be
//instantiated
private SingleObject(){}

//Get the only object available


public static SingleObject getInstance(){
return instance;
}
public void showMessage(){
System.out.println("Hello World!");
}}
Step 2
Get the only object from the singleton class.

SingletonPatternDemo.java

public class SingletonPatternDemo {


public static void main(String[] args) {
//illegal construct
//Compile Time Error: The constructor SingleObject() is not visible
//SingleObject object = new SingleObject();
//Get the only object available
SingleObject object = SingleObject.getInstance();
//show the message
object.showMessage();
}}
Step 3
Verify the output.

Hello World!
Composite Patterns:
Composite pattern is used where we need to treat a group of objects in similar way as a
single object. Composite pattern composes objects in term of a tree structure to
represent part as well as whole hierarchy. This type of design pattern comes under
structural pattern as this pattern creates a tree structure of group of objects.

This pattern creates a class that contains group of its own objects. This class provides
ways to modify its group of same objects.

We are demonstrating use of composite pattern via following example in which we will
show employees hierarchy of an organization.

Implementation
We have a class Employee which acts as composite pattern actor
class. CompositePatternDemo, our demo class will use Employee class to add
department level hierarchy and print all employees.

Step 1
Create Employee class having list of Employee objects.
import java.util.ArrayList;
import java.util.List;

public class Employee {


private String name;
private String dept;
private int salary;
private List<Employee> subordinates;

// constructor
public Employee(String name,String dept, int sal) {
this.name = name;
this.dept = dept;
this.salary = sal;
subordinates = new ArrayList<Employee>();
}

public void add(Employee e) {


subordinates.add(e);
}

public void remove(Employee e) {


subordinates.remove(e);
}

public List<Employee> getSubordinates(){


return subordinates;
}

public String toString(){


return ("Employee :[ Name : " + name + ", dept : " + dept + ", salary :" + salary+" ]");
}
}
Step 2
Use the Employee class to create and print employee hierarchy.

CompositePatternDemo.java

public class CompositePatternDemo {

public static void main(String[] args) {

Employee CEO = new Employee("John","CEO", 30000);

Employee headSales = new Employee("Robert","Head Sales", 20000);

Employee headMarketing = new Employee("Michel","Head Marketing", 20000);

Employee clerk1 = new Employee("Laura","Marketing", 10000)

Employee clerk2 = new Employee("Bob","Marketing", 10000)

Employee salesExecutive1 = new Employee("Richard","Sales",

Employee salesExecutive2 = new Employee("Rob","Sales", 10000)

CEO.add(headSales);

CEO.add(headMarketing)

headSales.add(salesExecutive1);

headSales.add(salesExecutive2);

headMarketing.add(clerk1);

headMarketing.add(clerk2);

//print all employees of the organization;

System.out.println(CEO);

for (Employee headEmployee : CEO.getSubordinates()) {

System.out.println(headEmployee);

for (Employee employee : headEmployee.getSubordinates()) {

System.out.println(employee);
} }}

Step 3
Verify the output.

Employee :[ Name : John, dept : CEO, salary :30000 ]

Employee :[ Name : Robert, dept : Head Sales, salary :20000 ]

Employee :[ Name : Richard, dept : Sales, salary :10000 ]

Employee :[ Name : Rob, dept : Sales, salary :10000 ]

Employee :[ Name : Michel, dept : Head Marketing, salary :20000 ]

Employee :[ Name : Laura, dept : Marketing, salary :10000 ]

Employee :[ Name : Bob, dept : Marketing, salary :10000 ]

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
We're going to create a Shape interface and concrete classes implementing
the Shape interface. A factory class ShapeFactory is defined as a next step.

FactoryPatternDemo, our demo class will use ShapeFactory to get a Shapeobject. It will
pass information (CIRCLE / RECTANGLE / SQUARE) to ShapeFactory to get the type
of object it needs.
Step 1
Create an interface.

Shape.java

public interface Shape {


void draw();
}
Step 2
Create concrete classes implementing the same interface.

Rectangle.java

public class Rectangle implements Shape {

@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
Create a Factory to generate object of concrete class based on given information.

ShapeFactory.java
public class ShapeFactory {

//use getShape method to get object of type shape


public Shape getShape(String shapeType){
if(shapeType == null){
return null;
}
if(shapeType.equalsIgnoreCase("CIRCLE")){
return new Circle();

} 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 {

public static void main(String[] args) {


ShapeFactory shapeFactory = new ShapeFactory();

//get an object of Circle and call its draw method.


Shape shape1 = shapeFactory.getShape("CIRCLE");

//call draw method of Circle


shape1.draw();

//get an object of Rectangle and call its draw method.


Shape shape2 = shapeFactory.getShape("RECTANGLE");

//call draw method of Rectangle


shape2.draw();

//get an object of Square and call its draw method.


Shape shape3 = shapeFactory.getShape("SQUARE");

//call draw method of square


shape3.draw();
}
}
Step 5
Verify the output.

Inside Circle::draw() method.

Inside Rectangle::draw() method.

Inside Square::draw() method.

Potrebbero piacerti anche