Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

A Modern Alternative to Abstract Factory Filtered Dependencies

DZone's Guide to

A Modern Alternative to Abstract Factory Filtered Dependencies

· Integration Zone
Free Resource

Are your API program basics covered? Read the 5 Pillars of Full Lifecycle API Management eBook

I've mentioned before that I really don’t like the Abstract Factory pattern, and in particular, code like this:

static IGUIFactory CreateOsSpecificFactory()
 {
    string sysType = ConfigurationSettings.AppSettings["OS_TYPE"];
    if (sysType == "Win") 
    {
        return new WindowsFactory();
    } 
    else 
    {
        return new MacFactory();
  }
}

One of the comments mentioned that this might not be ideal, but it is still better than:

if(RunningOnWindows)
 {
    // code
 }
 else if(RunningOnMac)
 {
    // code
 }
 else if(RunningOnLinux)
 {
    // code
}

And I agree. But I think that, as the comment mentioned, a far better alternative would be using the container. You can do this using:

[OperationSystem("Windows")]
public class WindowsFactory : IGUIFactory
{
} 
[OperationSystem("Linux")]
public class LinuxFactory : IGUIFactory
{
}
[OperationSystem("Mac")]
public class MacFactory : IGUIFactory
{
}

Then you just need to wire things through the container. Among other things, this means that we respect the open / closed principle. If we need to support a new system, we can just add a new class, we don’t need to modify code.

Remember, the Go4 book was written in the age of C++. Reflection didn’t exists, and that means that a lot of patterns do by hands things that can happen automatically.

 

Establish API creation, publishing and discovery as a master practice with the API Management Playbook.

Topics:

Published at DZone with permission of Oren Eini, DZone MVB. See the original article here.

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}