software architecture patterns for better software joe kunk [email protected] microsoft mvp glugnet...

48
Software Architecture Patterns for Better Software Joe Kunk [email protected] Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A. J. Boggs & Company www.ajboggs.com Principal & CTO Listen IT Solutions, LLC www.listenit.com BLOG: jbknet.blogspot.com

Upload: christina-gray

Post on 27-Dec-2015

216 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Software Architecture Patternsfor Better Software

Joe [email protected]

Microsoft MVP

GLUGnet President (2007-2009)

Senior Consultant A. J. Boggs & Companywww.ajboggs.com

Principal & CTOListen IT Solutions, LLCwww.listenit.com

BLOG: jbknet.blogspot.com

Page 2: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Design Challenges

Page 3: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Ever think that

someone must have figured this out before?

Page 4: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Patterns are simply a conceptual solution to a common problem

Page 5: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Definitiondesign pattern is a general reusable solution to a commonly occurring problem in software design

Patterns represent a shared vocabulary between architects and developers.

http://en.wikipedia.org/wiki/Design_pattern_(computer_science)

Page 6: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Questions

• Are design patterns new?

• Why do we care about design patterns?

• How do we use design patterns?

• How many patterns are there?

Page 7: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs
Page 8: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Design PatternsElements of Reusable Object-Oriented Software

Abstract, Adapter, Bridge, Builder, Chain, Command, Composite, Decorator, Façade, Factory, Flyweight, Interpreter, Mediator,

Memento, Observer, Prototype, Proxy, Singleton, State, Strategy, Template, Visitor

Page 9: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Patterns are generally grouped into three families.

Creational Structural Behavioral

Page 10: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Pattern FamiliesCreational deal with object creation mechanisms, trying to create objects in a manner suitable to the situation

Structuralease the design by identifying a simple way to realize relationships between entities

Behavioralidentify common communication patterns between objects and realize these patterns for flexibility in communication

Concurrencydeal with multi-threaded programming paradigm

Page 11: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Creational Patterns

Abstract FactoryFactory MethodBuilderLazy InitializationObject PoolSingletonMultitonResource Acquisition is Initialization

deal with object creation mechanisms, trying to create objects in a manner suitable to the situation

Test yourself

Page 12: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Structural Patterns

AdapterBridgeCompositeDecoratorFaçadeFlyweightProxy

ease the design by identifying a simple way to realize relationships between entities

Test yourself

Page 13: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Behavioral Patterns

Chain of ResponsibilityCommand InterpreterIterator MediatorMemento Null ObjectObserver StateStrategy SpecificationTemplate Method Visitor

identify common communication patterns between objects and realize these patterns for flexibility in communication

Test yourself

Page 14: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Let’s Make This Fun

Guess the pattern from the picture

Page 15: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Abstract Factory

About the Abstract Factory patternExample: ADO.Net ProviderExample: creation of different animal worlds for a computer game using different factories. Although the animals created by the Continent factories are different, the interactions among the animals remain the same.

Creational Gang of Four

Provide an interface for creating families of related or dependent objects without specifying their concrete classes.

Page 16: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Abstract FactoryCreational Gang of Four

Provide an interface for creating families of related or dependent objects without specifying their concrete classes.

public static void Main() { // Create and run the African animal world ContinentFactory africa = new AfricaFactory(); AnimalWorld world = new AnimalWorld(africa); world.RunFoodChain(); // Create and run the American animal world ContinentFactory america = new AmericaFactory(); world = new AnimalWorld(america); world.RunFoodChain(); // Wait for user input Console.ReadKey(); } }

class AnimalWorld { private Herbivore _herbivore; private Carnivore _carnivore; // Constructor public AnimalWorld(ContinentFactory factory) { _carnivore = factory.CreateCarnivore(); _herbivore = factory.CreateHerbivore(); } public void RunFoodChain() { _carnivore.Eat(_herbivore); } }

class AfricaFactory : ContinentFactory { public override Herbivore CreateHerbivore() { return new Wildebeest(); } // bison

public override Carnivore CreateCarnivore() { return new Lion(); } // wolf }

Page 17: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Adapter

About the Adapter patternExample: Converts the DOM of XML document into a tree structureExample: Chemical compound objects access the legacy databank via Adapter

Structural Gang of Four

Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn't otherwise because of incompatible interfaces.

Page 18: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

AdapterStructural Gang of Four

Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn't otherwise because of incompatible interfaces.

static void Main() { // Non-adapted chemical compound Compound unknown = new Compound("Unknown"); unknown.Display(); // Adapted chemical compounds Compound water = new RichCompound("Water"); water.Display(); Compound benzene = new RichCompound("Benzene"); benzene.Display(); Compound ethanol = new RichCompound("Ethanol"); ethanol.Display(); // Wait for user Console.ReadKey(); }

class RichCompound : Compound { private ChemicalDatabank _bank; // Constructor public RichCompound(string name) : base(name) { } public override void Display() { // The Adaptee _bank = new ChemicalDatabank(); _boilingPoint = _bank.GetCriticalPoint(_chemical, "B"); _meltingPoint = _bank.GetCriticalPoint(_chemical, "M"); _molecularWeight = bank.GetMolecularWeight(_chemical); _molecularFormula = bank.GetMolecularStructure(_chemical); base.Display(); Console.WriteLine(" Formula: {0}", _molecularFormula); Console.WriteLine(" Weight : {0}", _molecularWeight); Console.WriteLine(" Melting Pt: {0}", _meltingPoint); Console.WriteLine(" Boiling Pt: {0}", _boilingPoint); }

Page 19: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

BridgeDecouple an abstraction from its implementation

so that the two can vary independently.

About the Bridge patternExample: Abstract class of Shape can be implemented in many different

resolutions and APIs via a specific implementation class.

Structural Gang of Four

Page 20: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

BuilderSeparate the construction of a complex object from its representation

so that the same construction process can create different representations.

About the Builder patternA workshop object can build either a car, motorcycle, or scooter.http://www.dofactory.com/Patterns/PatternBuilder.aspx

Creational Gang of Four

Page 21: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

BuilderSeparate the construction of a complex object from its representation

so that the same construction process can create different representations.

Creational Gang of Four

• public static void Main()• {• VehicleBuilder builder;• • // Create shop with vehicle builders• Shop shop = new Shop();• • // Construct and display vehicles• builder = new ScooterBuilder();• shop.Construct(builder);• builder.Vehicle.Show();• • builder = new CarBuilder();• shop.Construct(builder);• builder.Vehicle.Show();• • builder = new MotorCycleBuilder();• shop.Construct(builder);• builder.Vehicle.Show();• • // Wait for user• Console.ReadKey();• }• }

Page 22: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Chain of Responsibility

About the Chain of Responsibility patternExample: several linked managers and executives can respond to a purchase request or hand it off to a superior. Each position has can have its own set of rules which orders they can approve.

Behavioral Gang of Four

Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving

objects and pass the request along the chain until an object handles it.

Page 23: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Chain of ResponsibilityBehavioral Gang of Four

Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving

objects and pass the request along the chain until an object handles it.

static void Main() { // Setup Chain of Responsibility Approver larry = new Director(); Approver sam = new VicePresident(); Approver tammy = new President(); larry.SetSuccessor(sam); sam.SetSuccessor(tammy); // Generate and process purchase requests Purchase p = new Purchase(2034, 350.00, "Supplies"); larry.ProcessRequest(p); p = new Purchase(2035, 32590.10, "Project X"); larry.ProcessRequest(p); p = new Purchase(2036, 122100.00, "Project Y"); larry.ProcessRequest(p); // Wait for user Console.ReadKey(); } }

Page 24: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

CommandEncapsulate a request as an object, thereby letting you parameterize clients

with different requests, queue or log requests, and support undoable operations.

About the Command patternExample: Ctrl-Z in windows applications

Behavioral Gang of Four

Page 25: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

CompositeCompose objects into tree structures to represent part-whole hierarchies.

Composite lets clients treat individual objects and compositions of objects uniformly.

About the Composite patternExample: allow the creation of a tree structure in which individual nodes are accessed uniformly whether they are leaf nodes or branch (composite) nodes.

Structural Gang of Four

Page 26: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

CompositeCompose objects into tree structures to represent part-whole hierarchies.

Composite lets clients treat individual objects and compositions of objects uniformly.

Structural Gang of Four

static void Main() { // Create a tree structure Composite root = new Composite("root"); root.Add(new Leaf("Leaf A")); root.Add(new Leaf("Leaf B")); Composite comp = new Composite("Composite X"); comp.Add(new Leaf("Leaf XA")); comp.Add(new Leaf("Leaf XB")); root.Add(comp); root.Add(new Leaf("Leaf C")); // Add and remove a leaf Leaf leaf = new Leaf("Leaf D"); root.Add(leaf); root.Remove(leaf); // Recursively display tree root.Display(1); // Wait for user Console.ReadKey(); } }

In effect, we are saying to each component, “Take responsibility for yourself. You must figure out whether you are an individual (Leaf) or a group (Composite).”

Leaves operate on themselves and represent themselves. Composites pass on the instructions coming from the top to their components (which again might be leaves or composites).

In this way, we have a self traversing structure which internally takes responsibility for ensuring that every member is properly instructed or updated.

At the top, we do not care who we are talking to. We know our instructions will be carried out properly regardless.

Page 27: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Decoratormake it possible to extend (decorate) the functionality of a class at runtime

About the Decorator patternAvailable in .Net 3.0 as Extension MethodsOften used to simplify a complex hierarchy of classes

Structural Gang of Four

Page 28: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Facade

About the Facade patternExpose only the desired properties and methods.

Structural Gang of Four

Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.

Page 29: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Factory

About the Factory patternExtends oriented vs. implements oriented like Abstract Factory.

Creational Gang of Four

Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.

Page 30: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Flyweight

About the Flyweight patternReduce memory usage, by externalizing state and sharing the behavior. Example: Share graphics drawing class among all characters in a document.

Structural Gang of Four

Use sharing to support large numbers of fine-grained objects efficiently.

Page 31: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Interpreter

About the Interpreter patternSpecialized database query languages such as SQL. Specialized computer languages to describe communication protocols Most computer languages actually incorporate several specialized languages.

Behavioral Gang of Four

Page 32: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Iterator

Uses for the Iterator patternforeach loop in .Net In Ruby: numbers = [1,2,3,4,5,6] numbers.each {|i| puts "I got #{i}"}

Behavioral Gang of Four

Access the elements of an aggregate object sequentially without exposing its underlying representation. Encapsulates internal structure of how the iteration occurs.

Page 33: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Mediator

About the Mediator patternHides complexity by encapsulating a set of complex operations. Acts as a decoupling agent.

Behavioral Gang of Four

Define an object that encapsulates how a set of objects interact, promoting loose coupling by avoiding explicit references. Can vary their interaction independently.

Page 34: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Memento

About the Memento patternEncapsulates an object’s state, while hiding how that state is stored or structured.Example: Database Transactions with Rollback

Behavioral Gang of Four

Without violating encapsulation, capture and externalize an object's internal state so that the object can be restored to this state later.

Page 35: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Observer

About the Observer patternExample: registered investors are notified every time a stock changes value.Publish / Subscribe model. Very commonly used.

Behavioral Gang of Four

Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.

Page 36: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

ObserverBehavioral Gang of Four

Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.

static void Main() { // Create IBM stock and attach investors IBM ibm = new IBM("IBM", 120.00); ibm.Attach(new Investor("Sorros")); ibm.Attach(new Investor("Berkshire")); // Fluctuating prices will notify investors ibm.Price = 120.10; ibm.Price = 121.00; ibm.Price = 120.50; ibm.Price = 120.75; // Wait for user Console.ReadKey(); } }

abstract class Stock { private string _symbol; private double _price; private List<IInvestor> _investors = new List<IInvestor>(); // Constructor public Stock(string symbol, double price) { this._symbol = symbol; this._price = price; }

public void Attach(IInvestor investor) { _investors.Add(investor); } public void Detach(IInvestor investor) { _investors.Remove(investor); } public void Notify() { foreach (IInvestor investor in _investors) { investor.Update(this); } Console.WriteLine(""); } // Gets or sets the price public double Price { get { return _price; } set { if (_price != value) { _price = value; Notify(); } } }

Page 37: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Prototype

About the Prototype patternExample: new Color objects are created by copying pre-existing, user-defined Colors of the same type.

Creational Gang of Four

Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype.

Page 38: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

PrototypeCreational Gang of Four

Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype.

static void Main() { ColorManager colormanager = new ColorManager(); // Initialize with standard colors colormanager["red"] = new Color(255, 0, 0); colormanager["green"] = new Color(0, 255, 0); colormanager["blue"] = new Color(0, 0, 255); // User adds personalized colors colormanager["angry"] = new Color(255, 54, 0); colormanager["peace"] = new Color(128, 211, 128); colormanager["flame"] = new Color(211, 34, 20); // User clones selected colors Color color1 = colormanager["red"].Clone() as Color; Color color2 = colormanager["peace"].Clone() as Color; Color color3 = colormanager["flame"].Clone() as Color; // Wait for user Console.ReadKey(); } }

// Create a shallow copy public override ColorPrototype Clone() { Console.WriteLine( "Cloning color RGB: {0,3},{1,3},{2,3}", _red, _green, _blue); return this.MemberwiseClone() as ColorPrototype; } } /// <summary> /// Prototype manager /// </summary> class ColorManager { private Dictionary<string, ColorPrototype> _colors = new Dictionary<string, ColorPrototype>(); // Indexer public ColorPrototype this[string key] { get { return _colors[key]; } set { _colors.Add(key, value); } } }

Page 39: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Proxy

About the Proxy patternExample: Internet security proxy on a corporate network. Web content filters.

Structural Gang of Four

Provide a surrogate or placeholder for another object to control access to it.

Page 40: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Public static Singleton myInstance(){

if (instance == null)instance = new Singleton()

return instance}

Singleton

About the Singleton patternExample: Usually limits to one, but can limit to a fixed number.

Creational Gang of Four

Ensure a class has only one instance and provides a global point of access to it.

Page 41: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

State

About the State patternExample: Allow an Account to behave differently depending on its balance. The difference in behavior is delegated to State objects called RedState, SilverState and GoldState. These states represent overdrawn accounts, starter accounts, and accounts in good standing.

Behavioral Gang of Four

Allow an object to alter its behavior when its internal state changes.The object will appear to change its class.

Page 42: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Strategy

About the Strategy patternDefine an interface that defines the strategy for executing an algorithm. A family of classes implement the interface, executing a different solution to the algorithm. Use in place of inheritance which only changes the how of something

Behavioral Gang of Four

Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.

Page 43: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Template

About the Template patternExample: A Sort() method that varies the sorting algorithm based on the nature of the data being sorted.

Behavioral Gang of Four

Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.

Page 44: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Visitor

About the Visitor patternExample: two objects traverse a list of Employees and performs the same operation on each Employee. The two visitor objects define different operations -- one adjusts vacation days and the other income.

Behavioral Gang of Four

Represent an operation to be performed on the elements of an object structure. Visitor defines a new operation without changing the classes of the elements on which it operates.

Page 45: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

VisitorBehavioral Gang of Four

Represent an operation to be performed on the elements of an object structure. Visitor defines a new operation without changing the classes of the elements on which it operates.

static void Main() { // Setup employee collection Employees e = new Employees(); e.Attach(new Clerk()); e.Attach(new Director()); e.Attach(new President()); // Employees are 'visited' e.Accept(new IncomeVisitor()); e.Accept(new VacationVisitor()); // Wait for user Console.ReadKey(); } }

class IncomeVisitor : IVisitor { public void Visit(Element element) { Employee employee = element as Employee; // Provide 10% pay raise employee.Income *= 1.10; } }

class VacationVisitor : IVisitor { public void Visit(Element element) { Employee employee = element as Employee; // Provide 3 extra vacation days employee.VacationDays += 3; } }

Page 46: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs
Page 47: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

Resources / Books

• www.wikipedia.org• www.doFactory.com (code samples)• Design Patterns: Elements of Reusable Object-

Oriented Software• Patterns of Enterprise Application Architecture• Head First Design Patterns

Page 48: Software Architecture Patterns for Better Software Joe Kunk joekunk@gmail.com Microsoft MVP GLUGnet President (2007-2009) Senior Consultant A.J. Boggs

That’s it folks. Thank you for attending.

Let’s go network at Ruby Tuesday.

Everyone Welcome!

Joe KunkEmail: [email protected]: @joekunk