
Explore design patterns in Java across creational, structural, and behavioral categories from the gang of four, with hands-on coding and UML concepts for high-quality, maintainable software.
Discover how this Java design patterns course organizes learning around programming concepts, why they matter, and how to apply them through PowerPoint slides and hands-on code demonstrations.
Explore design patterns as reusable, documented solutions to common software problems. Learn their core elements—name, problem, solution, consequences—and how patterns guide object-oriented design in Java.
Explore the advantages of design patterns, enabling software reuse, faster learning, and higher quality, maintainable code through encapsulation, cohesion, and low coupling in object-oriented design.
Explore creational, structural, and behavioral patterns, including factory, abstract factory, builder, prototype, singleton; adapter, composite, bridge, facade, proxy; and mediator, command, interpreter, chain of responsibility, organized by purpose and scope.
Learn to select and apply design patterns by analyzing context and intent, then define interfaces, pattern structure, and naming for modifiability and loose coupling.
Identify your Windows architecture to install the proper JDK: 64-bit requires Java SE 11, 32-bit uses Java SE 8, then download and install.
download and install IntelliJ IDEA (community edition) on Windows, then configure JDK 11 and set editor preferences like auto import and line numbers for a ready Java development environment.
Install the JDK 11 on Mac, download the Oracle JDK 11 LTS, and install it using the macOS dmg wizard to prepare for writing and running Java programs in IntelliJ.
Install and configure IntelliJ IDEA on Mac, choose the Community Edition, link it to the Java Development Kit, and adjust basic preferences for beginner-friendly Java programming.
Download and install java development kit 11 on Ubuntu Linux by downloading the java se 11 lts JDK tar.gz, extracting it to /usr/lib/jvm, and configuring java and javac with update-alternatives.
Install and configure IntelliJ IDEA on Linux, select the community edition, connect the JDK, set language level to 11, and enable auto import and line numbers.
Understand design principles and patterns that emphasize abstraction, encapsulation, high cohesion, low coupling, single responsibility, open/closed, and dependency injection for maintainable, extensible software.
Explore design smells in Java design, including rigidity, fragility, immobility, viscosity, needless repetition, opacity, and needless complexity; learn how design patterns promote high cohesion and loose coupling for maintainable code.
Program to an interface declares variables by a supertype and uses polymorphism to swap implementations at runtime, as shown by a monitor and projector example with loose coupling.
Explore composition over inheritance to build loosely coupled, encapsulated Java designs. Learn how has-a relationships power patterns like strategy and decorator, improve testability, and enable flexible software reuse.
Learn how delegation lets one class forward responsibilities to a delegate via object composition, increasing cohesion and runtime flexibility, with design pattern examples like state, strategy, visitor, and event delegation.
Learn the single responsibility principle by distinguishing cohesive classes with low coupling, and refactor an overburdened employee class into dedicated HR promotions and finance classes for focused responsibilities.
Discover how the open for extension, closed for modification principle guides extending functionality via interfaces rather than inheritance, enabling new shapes to be added without altering existing code.
Demonstrate the Liskov substitution principle by showing that subclass objects replace superclass objects without breaking behavior, using polymorphism and consistent input and return values.
Learn how the interface segregation principle splits fat interfaces into lean, cohesive ones so clients implement only used methods.
Explore the dependency inversion principle, where high- and low-level classes depend on abstractions, not concrete implementations, to achieve loose coupling via interfaces.
Learn how dependency injection replaces hard dependencies in client and service relationships with loose coupling by injecting services via constructors, setters, or interfaces, aligning with the dependency inversion principle.
Learn how UML, the unified modeling language, documents and visualizes design through diagrams such as class diagrams and sequence diagrams, a communication tool for object-oriented analysis, design, and design patterns.
Explore class diagrams, the main UML structural diagram, for modeling the static design of object-oriented systems, illustrating classes, attributes, methods, and relationships such as has-a and is-a.
Learn to draw class diagrams with UML notation, representing classes as rectangles with name, attributes, and methods, and applying inheritance, aggregation, composition, and dependency relationships using standard symbols.
Explore UML class diagrams and how the abstract factory, adapter, singleton, decorator, and strategy patterns are represented with symbols, relationships, and cardinality.
Explore creational design patterns, including factory, abstract factory, singleton, builder, and prototype, and learn how dependency injection and programming to interfaces enable open for extensibility and closed for modification.
Explore the factory method design pattern, a creational approach that decouples object creation from use by coding to an interface and deferring instantiation.
Learn the strictest factory method implementation with an abstract creator, concrete creators, and shape products (circle, square, rectangle), and how clients instantiate specific products via the factory method.
Learn a single concrete creator class factory method approach that uses a shape factory with a get shape method accepting a string to create circle, rectangle, or square, reducing subclasses.
Learn static factory methods in the Java design patterns course by using a static get shape method to create circle, rectangle, and square without instantiating a factory.
Apply the factory method pattern to create duck and tiger objects with a single factory method that returns an animal reference, then invoke walk or eat to verify correct instantiation.
Implement a factory method to create duck and tiger objects from an animal interface, and demonstrate via a client that calls speak and handles an invalid type with an exception.
Explore the abstract factory pattern, a creational design pattern that creates families of related products. It uses composition and the factory method to decouple clients from concrete classes.
Implement the abstract factory method pattern by selecting a family of products, such as shapes or colors, using a factory producer and concrete factories.
Apply the abstract factory method pattern to create Hollywood or Bollywood movies by genre, using interfaces and concrete classes to produce action or comedy movie instances.
Demonstrate the abstract factory method by modeling Hollywood and Bollywood movie products with action and comedy factory families. Show how a factory producer selects the right factory and movie.
Master the singleton design pattern, a creational pattern that guarantees a single instance with a global access point and private constructor, useful for printers, file systems, and logging.
Compare singleton and dependency injection in Java design patterns. Learn when DI replaces singletons, reduces statics, and improves unit testing with constructor or setter injection.
Master the singleton design pattern with a private constructor and a public static getInstance, and explore five approaches: lazy, synchronized, double-checked locking, eager, and bill pugh inner static class.
Explore the lazy initialization singleton pattern by implementing a private constructor and a get instance method, then test singleton behavior while detailing thread-safety risks and potential race conditions.
Demonstrates a thread-safe singleton using a synchronized getInstance method, preserves lazy initialization while explaining bottlenecks, race conditions, and overhead, and sets the stage for double-check locking.
Master the double-checked locking pattern to implement a singleton with a volatile instance, synchronizing only inside the first check to achieve thread-safe lazy initialization and better performance.
Explain eager initialization of singletons, created at class load time with a thread-safe static initializer, its drawbacks, and introduce the Bill Pugh lazy singleton via an inner static helper class.
Explore the Bill Pugh singleton pattern with an inner static helper class that lazily creates the instance without synchronization, ensuring thread safety.
Explore the Bill Pugh singleton approach by modeling a cricket captain as a single instance, then verify the same instance via getInstance and equals with a simple main method.
Shows the bill pugh singleton in Java, with a private constructor, a static inner helper class, and a get captain method to guarantee a single instance, plus a main tester.
Explore the builder design pattern, which separates complex object construction from representation, enabling multi-step, flexible creation of varying representations like vacation planners or string builders.
Explore how the builder pattern uses a director, a builder, and a concrete builder to assemble a product from parts. Highlight features include abstraction, modularity, and controlled construction.
Implement the builder pattern by designing a builder interface, concrete builders for car and motorcycle, and a director to assemble the vehicle product in an IntelliJ project.
Explore the builder design pattern through creating meals using veggie and chicken burgers with coke or Pepsi, wrapped or bottled, via a director, concrete builders, and a meal product.
demonstrates the builder design pattern by constructing vegetarian and non-vegetarian meals from burgers and drinks, using a director, meal builders, and packing with wrappers and bottles.
Master the prototype design pattern to copy a prototypical object, reducing costly object creation. Learn shallow vs deep copies, Java cloning issues, and when to use deserialization for deep copies.
Implement the prototype design pattern by cloning objects via a prototype interface and concrete prototypes. Use a shape cache to store prototypes and supply clones through the client.
Explore the issues of the clonable interface in Java, including shallow versus deep copies, and compare alternatives like copy constructors and serialization for the prototype design pattern.
Explore the prototype design pattern in Java by implementing a basic car prototype with nano and ford clones, using a basic car cache to return duplicates.
Demonstrates the prototype design pattern by building a clonable basic car hierarchy with Ford and nano, using a cache to retrieve clones and adjust their prices.
So you have some Java experience under your belt, but are trying to figure out what to do next to make it easier to get that next job or consulting gig, and to stand out from the crowd.
Maybe you have heard of design patterns before and have seen programmers who know them and are able to implement them are held in very high regard.
One thing is clear, Java programmers with design pattern experience are in high demand. Design patterns are heavily used in the real world, so it's essential that Java programmers learn how to identify design patterns and implement them.
And that's what you are going to learn in this course!
Perhaps you tried to learn about design patterns in the past, but struggled to understand them. This course is going to give you the core design patterns experience you need!
This course is unique in comparison to other design patterns courses.
Why? It not only teaches how to use design patterns, but perhaps more importantly, it teaches why you should use them! Why they are the best approach and how using them can make you a super productive and awesome Java Programmer.
The reality is that Java developers who truly understand how to use design patterns are in high demand.
So what specifically is included in this course?
This course focuses on the details and a thorough understanding of all design patterns from the Gang of four.
Who are the Gang of four?
Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides released a book in 1994 that was and is still considered a classic. The concepts are still very relevant in 2019!
This course is all about showing you how to use their design patterns in todays software development environment.
You will learn detailed aspects of common design patterns (23 from the Gang of four) using the Java programming language.
Why should I bother with Design Patterns?
In programming terms, a design pattern is a solution to a common problem that occurs when writing software. Think of it as more like a template than actual code - its a how-to to solve a problem that can be re-used in many different situations.
Using design patterns gives you a way to solve common problems with a proven solution! So learning java design patterns and architecture and being able to use and implement them are critical to take your Java programming to new levels.
What you will learn in this course.
You will learn how to implement specific design patterns in addition to learning why they are the best approach and how they make you a super productive and awesome Java programmer.
Many, many examples and challenges are provided to test your understanding of every pattern that you have learned.
This course is unique to other courses here at Udemy in that the details and the why are explained. We do not just go through projects and provide a how-to. You will learn WHY you should be using a particular design pattern and the benefits to doing so.
Jason Fedin, you instructor is an expert Java developer, and has one of the most popular C programming languages on Udemy (published on this channel).
As a professional programmer, with over 18 years of commercial experience, you can be assured you are learning from a true professional and learning the real-world skills you need to know to succeed.
If you are ready to get started, click on that enroll button and start taking your Java skills to new levels!