Welcome!

Java IoT Authors: Liz McMillan, Pat Romanski, Elizabeth White, Charles Araujo, Yeshim Deniz

Related Topics: Java IoT

Java IoT: Article

Java GoF Creational Design Patterns

For cleaner development and easier maintenance

A design pattern is a solution to a recurring problem. Although using patterns this way is well known and has been around for a while, it was only when the GoF wrote their famous book, Design Patterns, on software design patterns, that patterns slowly but surely became an industry standard.

A design pattern is not just object-oriented design, but the communication between these objects. The GoF Creational patterns are a specific subset of these patterns that create objects for you, rather than creating them directly. Why would you want that? It provides cleaner development and easier maintenance for your applications. I'll cover five creation patterns here, and attempt to help you learn and implement them. It's important to not only understand their usage, but also know when to use these patterns. (A basic knowledge of interfaces and abstract classes is assumed as a prerequisite for this article.)

I'll provide at least one simple way to implement each pattern, and at least one scenario in which you might use it. Of course, a complete description is beyond the scope of this article. The other two categories for patterns, as defined by the GoF, are structural and behavioral. We won't discuss these categories here, but instead will keep our focus on creational patterns.

The Factory Pattern
This pattern returns an instance of one of several possible classes based on the data passed. This allows us to introduce new classes without modifying the code substantially. An immediate advantage here is that the instantiation of the class occurs inside the Factory class, which provides more flexibility in code maintenance and development than having to create an object directly in the client of this class.

Example
An example of a Factory pattern is the home interface of an EJB that instantiates a bean based on the data passed to it. Here's another simple hypothetical example. We have a Web site where users are required to enter their phone numbers. To keep our example simple, the phone number can be entered in one of two formats, as shown in Table 1.

Our implementation of the phone classes would look like Listing 1. In this listing we have a base abstract class and two subclasses. Our base class is abstract because we want to enforce instantiation of a subclass only. It's also not necessary to define a constructor for our base class. We have a PhoneFactory class that decides which of the subclasses would be returned based on the argument that is passed to the factory. The returned object from our factory is one of the subclasses, depending on the data passed. Now all a client class needs to do is call the getPhoneNumber() method in the factory class with the phone number as its argument.

The Abstract Factory Pattern
An abstract factory is a factory object that returns one of several related factories. There can't be any simpler definition. This means that instead of returning one subclass, it returns an abstract class that can in turn return a family of its subclasses. Thus both composition and inheritance play equally important roles here. The benefit of using this pattern is that it isolates the concrete subclasses from the client. This pattern should be used when the system is required to be independent of how the components are organized.

Example
We'll expand our future example of phone numbers. If we internationalize our Web page, we can have different phone number types for different countries (see Table 2).

The implementation of the classes is shown in Listing 2. We have more or less a similar structure as before, only a little more complex. Here we have a base abstract class and two subclasses. The subclasses implement the abstract methods of the base class that are capable of returning a PhoneNumber object. We have an InternationalPhoneNumberFactory class that decides which of the subclasses would be returned based on the arguments that are passed to the factory. As before, all a client class needs to do is call the getInternationalPhoneNumber() method in the InternationalPhoneFactory class with the phone number as its argument. The instantiation details and which subclass gets instantiated are hidden from the user. Once we have an international phone number object, we can still have phone numbers with or without spaces for both of the countries. We would call the "with" or "without spaces" method using our previous PhoneFactory class, if required.

The Singleton Pattern
This pattern is used when a class can have only one instance in a system. Think of a Web application when one application-level class is used to track a number of clients. Multiple classes per session are unnecessary; just one for all the clients would suffice. This pattern can be achieved in a number of ways. For example, we can create an exception that will be thrown by a class if it's instantiated more than once. Next we'll have a boolean static variable in our class, because a static variable can be shared among all instances of a class. In the constructor of this class, we'll set this variable the first time it's instantiated. Any other time, since it is already set, the constructor would throw an exception if this variable is already set. This is an excellent strategy. But take care to de-set this variable when the instance is destroyed (in the finalize method). Different JVMs can exhibit different behaviors; using this would ensure we can instantiate an object of this class again after it is destroyed.

If a generic class is needed that only provides static methods, that class can also be declared as final. Using this final-static combination would prohibit any instance creation and allow us to use this class as a whole. Note that this is different from the earlier approach, where we actually created a single object of the class.

Another popular approach to creating Singleton patterns involves having a private constructor and a static method in a class. The private constructor would ensure that an instance can be created only from within the method of the class, which is static. The static method would return an instance and set a boolean variable indicating instance creation. As before, we would de-set this variable in the finalize method as a good coding practice.

These approaches are simple and direct, so I won't provide any example code for them.

The Builder Pattern
The Builder pattern allows a client object to construct a complex object by specifying its type and content only. The way in which objects are assembled can be achieved using a Factory pattern. The factory class used here is called Director, and the actual classes derived are called Builders. This pattern is similar to the abstract factory pattern because both return a family of objects. The difference, however, is that the abstract factory returns a family of related objects while the Builder pattern constructs a complex object one step at a time depending on the data supplied.

Example
I'll attempt to describe a simpler example in which a Builder pattern can be used without providing a Java template for it, as that is beyond the scope of this article (constructing a Builder pattern, Java example would consume 150-200 lines of code). Consider a fast-food restaurant like Burger King where they have a special meal for kids. Irrespective of whether the order is chicken, a hamburger, or something else, the meal always consists of food and a toy. Here the client is the customer, the cashier is the director, and the restaurant crew is the builder. The builder knows how to build the meal, the director knows what to build, but they don't know how to perform each other's tasks. This is a layer of insulation the pattern provides us, that each can be varied without affecting the other.

The Prototype Pattern
This pattern is used when you want to copy an existing instance of a class, instead of creating a new one. Why? Because there might be so much data already in the object that it will take a considerable amount of time to get it again with a new instance. We can use the clone() method of the Object class to create a copy. Of course, the objects that can be cloned need to implement the Cloneable interface.

Imagine a list of value objects that can be obtained from a database that will contain a thousand objects. Each of these value objects would have a lot of information. This data is displayed on a particular Web page and our business need states that the information it contains must be isolated from other database transactions until the user logs out. This information should be displayed in part on different Web pages. This calls for creating a clone. One thing to pay attention to while cloning is that any operation performed on the copied data will also occur on the original data because references to data objects are copied, not the objects themselves. In some cases, this might be unacceptable. In this case, our class would also implement a Serializable interface.

Now we would just write our object out to a stream and reread it, making the two objects completely independent of each other. This again assumes that all the objects contained in this class are themselves serializable. Listing 3 provides the deepClone() method.

Summary
I've discussed five creation patterns here. If you are interested in learning more about patterns, I would recommend reading one of the many books available about design patterns.

References

  • Sangal, P.M. "Using Interfaces and Abstract Classes": java.ittoolbox.com/documents/document.asp?i=3063
  • Java Creation Patterns: www.fluffycat.com/java/patterns.html#creationalpatterns
  • Cooper, J. "Java Design Patterns": www.patterndepot.com/put/8/JavaPatterns.htm

  • More Stories By Puneet Sangal

    Puneet Sangal has been in the Internet technology space for 14 years. He occasionally writes on Internet technology at http://www.inmovi.net/ He can be reached at [email protected]

    Comments (1) View Comments

    Share your thoughts on this story.

    Add your comment
    You must be signed in to add a comment. Sign-in | Register

    In accordance with our Comment Policy, we encourage comments that are on topic, relevant and to-the-point. We will remove comments that include profanity, personal attacks, racial slurs, threats of violence, or other inappropriate material that violates our Terms and Conditions, and will block users who make repeated violations. We ask all readers to expect diversity of opinion and to treat one another with dignity and respect.


    Most Recent Comments
    Neil Hornbeck 09/09/04 07:47:15 AM EDT

    The source listing is for a Java card applet, which doesn't seem correct for this article.

    @ThingsExpo Stories
    Digital Transformation is much more than a buzzword. The radical shift to digital mechanisms for almost every process is evident across all industries and verticals. This is often especially true in financial services, where the legacy environment is many times unable to keep up with the rapidly shifting demands of the consumer. The constant pressure to provide complete, omnichannel delivery of customer-facing solutions to meet both regulatory and customer demands is putting enormous pressure on...
    The best way to leverage your CloudEXPO | DXWorldEXPO presence as a sponsor and exhibitor is to plan your news announcements around our events. The press covering CloudEXPO | DXWorldEXPO will have access to these releases and will amplify your news announcements. More than two dozen Cloud companies either set deals at our shows or have announced their mergers and acquisitions at CloudEXPO. Product announcements during our show provide your company with the most reach through our targeted audienc...
    DXWorldEXPO LLC announced today that All in Mobile, a mobile app development company from Poland, will exhibit at the 22nd International CloudEXPO | DXWorldEXPO. All In Mobile is a mobile app development company from Poland. Since 2014, they maintain passion for developing mobile applications for enterprises and startups worldwide.
    "Akvelon is a software development company and we also provide consultancy services to folks who are looking to scale or accelerate their engineering roadmaps," explained Jeremiah Mothersell, Marketing Manager at Akvelon, in this SYS-CON.tv interview at 21st Cloud Expo, held Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA.
    JETRO showcased Japan Digital Transformation Pavilion at SYS-CON's 21st International Cloud Expo® at the Santa Clara Convention Center in Santa Clara, CA. The Japan External Trade Organization (JETRO) is a non-profit organization that provides business support services to companies expanding to Japan. With the support of JETRO's dedicated staff, clients can incorporate their business; receive visa, immigration, and HR support; find dedicated office space; identify local government subsidies; get...
    The current age of digital transformation means that IT organizations must adapt their toolset to cover all digital experiences, beyond just the end users’. Today’s businesses can no longer focus solely on the digital interactions they manage with employees or customers; they must now contend with non-traditional factors. Whether it's the power of brand to make or break a company, the need to monitor across all locations 24/7, or the ability to proactively resolve issues, companies must adapt to...
    "We view the cloud not as a specific technology but as a way of doing business and that way of doing business is transforming the way software, infrastructure and services are being delivered to business," explained Matthew Rosen, CEO and Director at Fusion, in this SYS-CON.tv interview at 18th Cloud Expo (http://www.CloudComputingExpo.com), held June 7-9 at the Javits Center in New York City, NY.
    DXWorldEXPO LLC announced today that the upcoming DXWorldEXPO | CloudEXPO New York event will feature 10 companies from Poland to participate at the "Poland Digital Transformation Pavilion" on November 12-13, 2018.
    As data explodes in quantity, importance and from new sources, the need for managing and protecting data residing across physical, virtual, and cloud environments grow with it. Managing data includes protecting it, indexing and classifying it for true, long-term management, compliance and E-Discovery. Commvault can ensure this with a single pane of glass solution – whether in a private cloud, a Service Provider delivered public cloud or a hybrid cloud environment – across the heterogeneous enter...
    DXWorldEXPO LLC announced today that ICC-USA, a computer systems integrator and server manufacturing company focused on developing products and product appliances, will exhibit at the 22nd International CloudEXPO | DXWorldEXPO. DXWordEXPO New York 2018, colocated with CloudEXPO New York 2018 will be held November 11-13, 2018, in New York City. ICC is a computer systems integrator and server manufacturing company focused on developing products and product appliances to meet a wide range of ...
    More and more brands have jumped on the IoT bandwagon. We have an excess of wearables – activity trackers, smartwatches, smart glasses and sneakers, and more that track seemingly endless datapoints. However, most consumers have no idea what “IoT” means. Creating more wearables that track data shouldn't be the aim of brands; delivering meaningful, tangible relevance to their users should be. We're in a period in which the IoT pendulum is still swinging. Initially, it swung toward "smart for smart...
    Major trends and emerging technologies – from virtual reality and IoT, to Big Data and algorithms – are helping organizations innovate in the digital era. However, to create real business value, IT must think beyond the ‘what’ of digital transformation to the ‘how’ to harness emerging trends, innovation and disruption. Architecture is the key that underpins and ties all these efforts together. In the digital age, it’s important to invest in architecture, extend the enterprise footprint to the cl...
    Headquartered in Plainsboro, NJ, Synametrics Technologies has provided IT professionals and computer systems developers since 1997. Based on the success of their initial product offerings (WinSQL and DeltaCopy), the company continues to create and hone innovative products that help its customers get more from their computer applications, databases and infrastructure. To date, over one million users around the world have chosen Synametrics solutions to help power their accelerated business or per...
    Coca-Cola’s Google powered digital signage system lays the groundwork for a more valuable connection between Coke and its customers. Digital signs pair software with high-resolution displays so that a message can be changed instantly based on what the operator wants to communicate or sell. In their Day 3 Keynote at 21st Cloud Expo, Greg Chambers, Global Group Director, Digital Innovation, Coca-Cola, and Vidya Nagarajan, a Senior Product Manager at Google, discussed how from store operations and ...
    In an era of historic innovation fueled by unprecedented access to data and technology, the low cost and risk of entering new markets has leveled the playing field for business. Today, any ambitious innovator can easily introduce a new application or product that can reinvent business models and transform the client experience. In their Day 2 Keynote at 19th Cloud Expo, Mercer Rowe, IBM Vice President of Strategic Alliances, and Raejeanne Skillern, Intel Vice President of Data Center Group and ...
    Dion Hinchcliffe is an internationally recognized digital expert, bestselling book author, frequent keynote speaker, analyst, futurist, and transformation expert based in Washington, DC. He is currently Chief Strategy Officer at the industry-leading digital strategy and online community solutions firm, 7Summits.
    We are seeing a major migration of enterprises applications to the cloud. As cloud and business use of real time applications accelerate, legacy networks are no longer able to architecturally support cloud adoption and deliver the performance and security required by highly distributed enterprises. These outdated solutions have become more costly and complicated to implement, install, manage, and maintain.SD-WAN offers unlimited capabilities for accessing the benefits of the cloud and Internet. ...
    Founded in 2000, Chetu Inc. is a global provider of customized software development solutions and IT staff augmentation services for software technology providers. By providing clients with unparalleled niche technology expertise and industry experience, Chetu has become the premiere long-term, back-end software development partner for start-ups, SMBs, and Fortune 500 companies. Chetu is headquartered in Plantation, Florida, with thirteen offices throughout the U.S. and abroad.
    Bill Schmarzo, author of "Big Data: Understanding How Data Powers Big Business" and "Big Data MBA: Driving Business Strategies with Data Science," is responsible for setting the strategy and defining the Big Data service offerings and capabilities for EMC Global Services Big Data Practice. As the CTO for the Big Data Practice, he is responsible for working with organizations to help them identify where and how to start their big data journeys. He's written several white papers, is an avid blogge...
    Bill Schmarzo, author of "Big Data: Understanding How Data Powers Big Business" and "Big Data MBA: Driving Business Strategies with Data Science," is responsible for setting the strategy and defining the Big Data service offerings and capabilities for EMC Global Services Big Data Practice. As the CTO for the Big Data Practice, he is responsible for working with organizations to help them identify where and how to start their big data journeys. He's written several white papers, is an avid blogge...