Product Trader INTENT ALSO KNOWN AS MOTIVATION

Similar documents
An Object-Oriented Approach to File Management within a SAS AF Application

Copyright. Disclaimer. Safety Instructions !!! !!!!" !!! #!# # " $ #! % !# #! " ' ( ) # * ( ) $ +, $ ' $' " ! " - ' # $ #! # . / $!( $ $ 1" !" 2!

SQL Query Window Classes: How To Incorporate the SQL Column Expression Builder Class In Custom SAS/AF Applications

3URGXFW,QIRUPDWLRQ. Document No Edition 03/2001 &6%5$66

The Oxygen TM VX1-1600SW Graphics Accelerator User s Guide. 3Dlabs, Inc. 480 Potrero Avenue Sunnyvale, CA

The Task Output Framework: An Object Oriented Tool For Application Development John E. Ellis, Trilogy Consulting Corp.

(Cat. No DMC, -DMC1, -DMC4, and -DXPS) User Manual

Going Up Against Time

DIGITAL WORKSPACE... Ignite your brand! File Routing & Collaboration. Basic Approver Guide 5.0 V1

Microsoft Azure StorSimple Appliance 8600 Hardware Installation Guide

Factory Method Pattern Creational. » Define an interface for creating an object but lets subclasses decide the specific class to instantiate

UHFRYHU\ WHFKQLTXH PD\ EH XVHIXO LQ GDWDEDVHV ZLWK PXOWLSOH VHWV RI ORJLFDOO\

62&&(5$/,&( 3$75,&.5$0(5 -($1&+5,6723+(=8))(5(<

Chapter 1 Introduction Who should read this handbook What the chapters describe Other documents...1-2

1791 Discrete I/O AC and DC Block I/O Input and Output Modules User Manual

Lecture 13: Design Patterns

Pattern Resources. Lecture 25: Design Patterns. What are Patterns? Design Patterns. Pattern Languages of Programming. The Portland Pattern Repository

6300 Series Inserter OPERATOR MANUAL SECOND EDITION

INSTALLATION SUPPLEMENT

4.1 Introduction Programming preliminaries Constructors Destructors An example... 3

INTUITIVE DESIGN METHOD (IDM), A NEW APPROACH ON DESIGN METHODS INTEGRATION

Design Pattern- Creational pattern 2015

Design Patterns. Manuel Mastrofini. Systems Engineering and Web Services. University of Rome Tor Vergata June 2011

Object-Oriented Design

(QTOU&KCIPQUVKE6GEJPKSWGU #P1TCENG6GEJPKECN9JKVG2CRGT,WPG

Are distributed objects fast enough?

Laboratorio di Progettazione di Sistemi Software Design Pattern Creazionali. Valentina Presutti (A-L) Riccardo Solmi (M-Z)

Goals of Lecture. Lecture 27: OO Design Patterns. Pattern Resources. Design Patterns. Cover OO Design Patterns. Pattern Languages of Programming

6LHPHQV 1L[GRUI 3ULPHUJ\ 8VLQJ0LFURVRIW64/6HUYHU (QWHUSULVH(GLWLRQ DQG0LFURVRIW:LQGRZV17

Software Design COSC 4353/6353 D R. R A J S I N G H

Squeak Object Model. Technion - Israel Institute of Technology. Updated: Spring Object-Oriented Programming 1

What does Y.3001 say?

User Guide for. Increase Sales. Reduce Abandoned Calls. Increase Service. Increase Agent Productivity. Reduce Operating Expenses. Reduce Time in Queue

(Factory Method) (Intent) (Motivation) (instantiate) (defer) f. (application) (application) ƒ (document) ¾ (application-specific)

Prototype Description. Interpreter. interpreter Calculator Design Rationales. Prototype Participants. Interpreter with Factory Method.

Distributed Power System SA500 Drive Diagnostics, Troubleshooting, and Start-Up Guidelines

7UDIILF*HQHUDWRUIRUDQ2QOLQH6LPXODWRU

Multiobjective Network Design Optimisation Using Parallel Evolutionary Algorithms

Object Oriented Programming in Java. Jaanus Pöial, PhD Tallinn, Estonia

Design Pattern and Software Architecture: IV. Design Pattern

MONAD: A Flexible Architecture for Multi-Agent Control

Architectural Walkthroughs Using Portal Textures

CRs for 04.08, SMG3 WPA, Phase 2+, Release 96, Non-Strategic

Keywords: Abstract Factory, Singleton, Factory Method, Prototype, Builder, Composite, Flyweight, Decorator.

Creational Patterns. Factory Method (FM) Abstract Factory (AF) Singleton (SI) Prototype (PR) Builder (BU)

ZH FRQQHFW $SROOR3UR$

WORKING PAPER NO. 274 INTERPRETING IMPLIED RISK-NEUTRAL DENSITIES: THE ROLE OF RISK PREMIA PETER HÖRDAHL, DAVID VESTIN

Computer-Aided Product Development

8m Gravity column. X4 Moment frame. X3 X2 20 m

Smart Motor Manager DeviceNet Communication Card

Some instance messages and methods

Exception Handling Alternatives (Part 2)

Particle Physics 3+< ' $FRVWD

The manumission inscriptions from Lemnos: some news

Measuring Inequality by Counting Complaints : Theory and Empirics. Kurt Devooght Katholieke Universiteit Leuven

What is Design Patterns?

Design Patterns. An introduction

On the Role of Language Constructs for Framework Design COT/ Centre for Object Technology

Forecasting Volatility using LINEX Loss Functions

Practical Geostatistics Isobel Clark. William V Harper

Finding Information in an LDAP Directory

3RLQW5HSUHVHQWDWLRQRI6SDWLDO2EMHFWVDQG4XHU\:LQGRZ([WHQVLRQ $1HZ7HFKQLTXHIRU6SDWLDO$FFHVV0HWKRGV

Pushing SAS/AF and FRAME Entries in MVS to the Limit: The USEPA's AIRS Graphics System

Larson Software Technology, Inc.

A Conceptual Model for Pervasive Computing

Synthesis of UML-Models for Reconfigurable Hardware

Chapter 1 Overview. Introduction 1-2. Specification 1-9. Application of the DX

A METHOD FOR INTEGRATING LEGACY SYSTEMS WITHIN DISTRIBUTED OBJECT ARCHITECTURE

Factory Method. Comp435 Object-Oriented Design. Factory Method. Factory Method. Factory Method. Factory Method. Computer Science PSU HBG.

Modellistica Medica. Maria Grazia Pia, INFN Genova. Scuola di Specializzazione in Fisica Sanitaria Genova Anno Accademico

From Market Micro-structure to Macro Fundamentals: is there Predictability in the Dollar-Deutsche Mark Exchange Rate?

An Introduction to Patterns

Object-Oriented Oriented Programming Factory Method Pattern Abstract Factory Pattern. CSIE Department, NTUT Woei-Kae Chen

Creational Design Patterns

Object-Oriented Design

Software Design Patterns. Background 1. Background 2. Jonathan I. Maletic, Ph.D.

Chapter 10 Introduction to Classes

IT Investment and Hicks' Composite-Good Theorem: The U.S. Experience

Software Reengineering Refactoring To Patterns. Martin Pinzger Delft University of Technology

/,1.WR0RGEXV3OXV *DWHZD\ ,QVWUXFWLRQ0DQXDO. Copyright 1995 by Eurotherm Drives, Inc. Printed in the United States of America 0595 HA Issue 2

Idioms for Building Software Frameworks in AspectJ

Lecture 18 Tao Wang 1

Programming Languages Fall 2014

Object Model. Object Oriented Programming Spring 2015

Design of Software Systems (Ontwerp van SoftwareSystemen) Design Patterns Reference. Roel Wuyts

7HDFKLQJ&RPSXWHU$UFKLWHFWXUH2UJDQLVDWLRQXVLQJVLPXODWRUV

Inheritance. Inheritance Reserved word protected Reserved word super Overriding methods Class Hierarchies Reading for this lecture: L&L

Top Down Design vs. Modularization

2.1 Design Patterns and Architecture (continued)

The Smalltalk class hierarchy

On the Political Economy of Housing's Tax Status

verification is to find the faults in the design itself. The fault may be instantiated as an

Seize the State, Seize the Day

What is Design Patterns?

Design Patterns V Structural Design Patterns, 2

COURSE 2 DESIGN PATTERNS

This directory contains the controller (with associated Simulink and MATLAB files) for the experiment called:

Design Pattern Detection

Creational Patterns for Variability

1769 Compact I/O Power Supplies and Communication Bus Expansion Cables

Transcription:

Product Trader 'LUN%lXPHUDQG'LUN5LHKOH INTENT /HW FOLHQWV FUHDWH REMHFWV E\ QDPLQJ DQ DEVWUDFW VXSHUFODVV DQG E\ SURYLGLQJ D VSHFLILFDWLRQ $ 3URGXFW7UDGHUGHFRXSOHVWKHFOLHQWIURPWKHSURGXFWDQGWKHUHE\HDVHVWKHDGDSWDWLRQFRQILJX UDWLRQDQGHYROXWLRQRIFODVVKLHUDUFKLHVIUDPHZRUNVDQGDSSOLFDWLRQV ALSO KNOWN AS 9LUWXDO&RQVWUXFWRU/DWH&UHDWLRQ MOTIVATION 6XSSRVH \RX KDYH GHVLJQHG D FODVV KLHUDUFK\ RI GRPDLQ YDOXH W\SHV OLNH $FFRXQW1XPEHU $PRXQW,QWHUHVW5DWHRU6RFLDO6HFXULW\1XPEHU7KHVHYDOXHW\SHVZLOOEHXVHGLQVHYHUDODSSOL FDWLRQV)RUH[DPSOHRQHVXFKDSSOLFDWLRQZLOOSUHVHQWDIRUPRQWKHVFUHHQDQGOHWXVHUVHGLWLWV ILHOGV7KHYDOXHW\SHVRIWKHILHOGVFRUUHVSRQGWRWKHGRPDLQYDOXHW\SHV6LQFHHDFKYDOXHW\SH KDVLWVRZQVHPDQWLFVDQGHGLWLQJFRQVWUDLQWV\RXPLJKWZDQWWRSURYLGHVSHFLDOL]HGZLGJHWVIRU HDFKRIWKHVHYDOXHW\SHVDVVKRZQLQILJXUHDQG DomainValue AccountNumber Amount InterestRate Date )LJXUH'RPDLQ9DOXHFODVVKLHUDUFK\ DomainWidget AccountNumber Widget Amount Widget InterestRate Widget Date Widget CreditAmount Widget )LJXUH'RPDLQ:LGJHWFODVVKLHUDUFK\ZLWKVSHFLDOL]HG$PRXQW:LGJHWFODVV *LYHQD)RUPREMHFWZLWKDOOWKHILHOGVDQGDVVRFLDWHGYDOXHW\SHVKRZGR\RXFUHDWHWKHZLGJHWV FRUUHVSRQGLQJWRWKHYDOXHW\SHV" Published in Pattern Languages of Program Design 3. Edited by Robert C. Martin, Dirk Riehle and Frank Buschmann. Addison-Wesley, 1998. Chapter 3, page 29-46.

<RXPLJKWEHWHPSWHGWRZULWHDELJFDVHVWDWHPHQWIRUDOOYDOXHW\SHVZKLFKFUHDWHVDZLGJHWIRU DJLYHQYDOXHW\SHEXWWKLVFXPEHUVRPHDQGPLJKWUHTXLUHIUHTXHQWFKDQJHVDQGHQKDQFHPHQWV <RXPLJKWXVHD)DFWRU\0HWKRGIRUWKHYDOXHW\SHVVRWKDWHDFKYDOXHW\SHFDQUHWXUQDGHIDXOW ZLGJHWIRULW%XWWKHQ\RXZLOORQO\EHDEOHWRSURYLGHDVLQJOHZLGJHWW\SHIRUDYDOXH W\SH 0RUHRYHULIWKHYDOXHW\SHVDUHXVHGLQDQRQLQWHUDFWLYHHQYLURQPHQWOLNHQLJKWO\EDWFKUXQV \RXPDNHWKHEDWFKDSSOLFDWLRQOLQNWKHZLQGRZV\VWHPHYHQWKRXJKLWLVQ WQHHGHG<RXPLJKW DOVRFRQVLGHUXVLQJDQ$EVWUDFW)DFWRU\:KLOHWKLVKLGHVWKHFUHDWLRQSURFHVVIURPWKHFOLHQWLW GRHVQ WFODULI\ZKDWKDSSHQVEHKLQGWKHIDFWRU\LQWHUIDFH\RXPLJKWVWLOOKDYHWRZULWHDELJFDVH VWDWHPHQWWRGLVWLQJXLVKEHWZHHQWKHGLIIHUHQWYDOXHW\SHV,WLVPXFKEHWWHUWRJRWRVRPHREMHFWDQGDVNLWWRUHWXUQDQLQVWDQFHRID'RPDLQ:LGJHWVXE FODVVZKLFKILWVDJLYHQYDOXHW\SHEHVW7KLVREMHFWPLJKWEHWKHDEVWUDFW'RPDLQ:LGJHWFODVV LWVHOIRUDIDFWRU\REMHFWRUDWUDGHUREMHFW:HFDOOWKLVSDWWHUQ3URGXFW7UDGHUDQGLWLVDOODERXW KRZWRGRWKLVIOH[LEO\DQGHIILFLHQWO\ 6XSSRVH'RPDLQ:LGJHWRIIHUVDFODVVRSHUDWLRQWKDWOHWV\RXGRWKLV,Q&LWORRNVOLNH static DomainWidget* DomainWidget::createFor(DomainValue*); DQGLQ6PDOOWDONLWORRNVOLNH DomainWidget class>>createfor: adomainvalue.,qwhuqdoo\wkhzlgjhwfodvvpljkwpdlqwdlqdglfwlrqdu\ridoolwvvxefodvvhvzklfklwlqgh[hvzlwk WKH FODVV UHSUHVHQWLQJ D JLYHQ YDOXH W\SH FUHDWH)RU FDQ EH HDVLO\ LPSOHPHQWHG WKHQ 7KH 'RPDLQ:LGJHWFODVVWDNHVWKH YDOXH W\SH V FODVV DV D NH\ IRU WKH GLFWLRQDU\ ZKLFK UHWXUQV WKH ZLGJHWVXEFODVVVSHFLILFDOO\GHVLJQHGIRUWKHYDOXHW\SH,WWKHQFUHDWHVDQLQVWDQFHRILWZKLFKLW UHWXUQVWRWKHFOLHQW7KLVSURFHVVLVIDVWDQGUHTXLUHVRQO\FRQVWDQWWLPH 7KHDFWXDOFODVVZKLFKLVWREHLQVWDQWLDWHGLVGHWHUPLQHGRQO\DWUXQWLPHDQGLWLVDFFHVVHGXVLQJ DEVWUDFW FODVVHV RQO\ 7KXV WKH FRQFUHWH VXEFODVVHV DUH KLGGHQ IURP WKH FOLHQW 0RUHRYHU WKH GLFWLRQDU\FDQEHFKDQJHGDQGUHFRQILJXUHGDWUXQWLPH7KLVOHWVXVHDVLO\FRQILJXUHDQGHYROYH FODVVKLHUDUFKLHVIUDPHZRUNVDQGDSSOLFDWLRQV APPLICABILITY 8VHD3URGXFW7UDGHULI you want to make clients fully independent from concrete implementations of the abstract Product class (decoupling argument); or you want to dynamically select a product class according to selection criteria available only at runtime (dynamic selection argument); or you want to configure the kinds of product classes instantiated for a given selection criterion, either statically or at runtime (flexible configuration argument); or you want to change and evolve the product class hierarchy without affecting clients (evolution argument). 'RQRWXVHD3URGXFW7UDGHUDVDUHSODFHPHQWIRU)DFWRU\0HWKRGVRUGLUHFWREMHFWFUHDWLRQ

STRUCTURE 7KHVWUXFWXUHGLDJUDPLVVKRZQLQILJXUH Client Specification ProductTrader Creator Product boolean match(spec) integer hashcode() Product create(spec) Creator lookup(spec) Product create(spec) Class productclass() add(creator) remove(creator) substitute(creator) ConcreteProductA )LJXUH6WUXFWXUHGLDJUDPRIWKH3URGXFW7UDGHUSDWWHUQ ConcreteProductB PARTICIPANTS Client (Form) B creates a Specification for a ConcreteProduct class; B initiates the creation process by providing the Product Trader with a Specification. Product (DomainWidget) B defines the interface to a class hierarchy of which objects are to be instantiated. ConcreteProduct (DateWidget, AmountWidget) B represents a concrete Product class; B provides enough information to decide whether it matches a Specification. Product Trader (DomainWidget class object) B provides operations which let a client supply a Specification for a ConcreteProduct class; B maps a Specification onto a Creator for a ConcreteProduct class; B provides operations to configure the mapping by some configuration mechanism; B can be as simple as a hashtable and as complex as a full Object Trader. Creator (ConcreteProduct class objects) B defines the interface to create instances of a ConcreteProduct; B knows how to instantiate exactly one ConcreteProduct; Specification (DomainValue subclasses) B represents a specification of a ConcreteProduct class; B is used as the lookup argument for a Creator instance;

B can be as lightweight as a string and as heavyweight as a propositional calculus formula. COLLABORATIONS )LJXUHVKRZVDQLQWHUDFWLRQGLDJUDPRID3URGXFWVHOHFWLRQDQGFUHDWLRQSURFHVV7KHIROORZLQJ FROODERUDWLRQVDUHLQYROYHG The Client asks the Product Trader for a Product instance matching a Specification. The Product Trader maintains a dictionary of Creator instances. The Product Trader looks up a Creator for a given Specification. The Product Trader delegates the creation process to a Creator. A Creator creates a ConcreteProduct instance. D&OLHQW D6SHFLILFDWLRQ D3URGXFW7UDGHU D&UHDWRU D&RQFUHWH3URGXFW QHZ FUHDWH)RU KDVKFRGH ORRNXS FUHDWH QHZ )LJXUH,QWHUDFWLRQGLDJUDPRI3URGXFW7UDGHU CONSEQUENCES 7KH3URGXFW7UDGHUSDWWHUQKDVWKHIROORZLQJDGYDQWDJHVDQGFRQVHTXHQFHV Clients become independent of ConcreteProduct classes. Clients are fully decoupled from the internal structure of the Product class hierarchy. Once you have written the code which creates the Specification instance and calls the createfor operation of the abstract Product class, you are done with the client code. Product classes are determined at runtime. Sometimes, the criteria which define the class fitting a task best are not known until runtime. Product Trader lets you turn these criteria into a Specification at runtime and use it for ConcreteProduct class lookup. Thus, you get the maximum flexibility for selecting ConcreteProduct classes. Products can be configured for specific domains. Product Trader lets you configure the available ConcreteProduct classes created via the abstract Product class by adding, substituting and removing Creators for ConcreteProduct classes. This lets you easily configure frameworks and applications for specific domains.

Product class hierarchies can be evolved easily. Since clients are fully decoupled from the internals of the Product class hierarchy, class names, hierarchy structure, and implementation strategies of ConcreteProduct classes can be changed without affecting them (as long as the ConcreteProduct classes preserve the semantics of the abstract Product class). New product classes can be introduced easily. It is very easy to add new ConcreteProduct classes to an existing framework it does not require any changes to the framework. New ConcreteProduct classes can be written without having to change existing code. Only configuration code or makefiles have to be changed. Products need not be single classes but can be any complex component. The Creator might hide potentially complex creation processes, for example by cloning complex Prototype structures. 7KH3URGXFW7UDGHUSDWWHUQKDVWKHIROORZLQJGLVDGYDQWDJHVDQGOLDELOLWLHV Increased control and dependency complexity. The pattern turns compile-time dependencies of product creation into runtime dependencies. This makes the resulting system harder to understand, because the dependencies are not explicitly written down as code. Need for advanced configuration mechanisms. When applying Product Trader, objects of classes can and will be created which are not statically referenced starting with some root class. Thus, a linker might consider those classes as superfluous and decide not to link them. See the Implementation section for techniques of dealing with this problem. Ambiguous specifications. Depending on the type and implementation of a specification, not only a single class can match it but rather a set of equivalent classes (with respect to the specification). This does not pose problems, since any class matching the requirements will do the job. However, ambiguities might indicate that the specification itself was either imprecise or underdetermined. Special constructor parameters require overhead. If a ConcreteProduct class requires special constructor parameters during the early object building process, you must supply them in advance. It requires some overhead to do so. You could broaden the creation interface or put the constructor parameters into a generic parameter carrier object. You should be careful, however, not to make any implicit assumptions about specific subclasses being selected by your Specification. IMPLEMENTATION 7KHLPSOHPHQWDWLRQRID3URGXFW7UDGHUUHTXLUHVIRXUPDLQGLPHQVLRQVWREHFRQVLGHUHGWKHLP SOHPHQWDWLRQ RI WKH PDSSLQJ IURP 6SHFLILFDWLRQ WR&UHDWRU WKH LPSOHPHQWDWLRQ RI WKH &UHDWRU LWVHOIWKHLPSOHPHQWDWLRQRI6SHFLILFDWLRQVDQGFRQILJXUDWLRQPHFKDQLVPV Implementing the mapping from Specification to Creator. The mapping can be realized by a simple dictionary in the abstract Product class, or by delegating the task to a product specific ProductTrader, or by delegating the task to a global ProductTrader. B Using a simple dictionary puts the management of the mapping into the abstract Product class. This is only advisable, if Product Trader is applied to the Product hierarchy only, and if the handling of specifications is very specialized for this particular class hierarchy. Otherwise consider using a ProductTrader.

B B Using a ProductTrader takes the burden of managing specifications, creators, and the mapping from specifications to creators from the Product class. Each class hierarchy can have its own ProductTrader which deals with specifications for this class hierarchy. This solution is both flexible and offers good code reuse. Using a single global ProductTrader centralizes all specifications and all class semantics in one single place. This goes beyond the class hierarchy specific ProductTrader and should be applied if complex class retrieval and runtime configuration issues must be considered. Implementing Creators. Creators can be implemented as prototypes, class objects, or specific dedicated Creator objects, for example generated by C++ templates. You will want to avoid introducing a Creator class for every Product class by hand, so consider using one of these variants. B B Using prototypes or class objects amounts to about the same: These objects come for free with any major system and usually provide a clone or a create operation which can carry out the actual creation of the Product instance. The clone operation must be robust with respect to copying. Using dedicated Creator objects. In C++, you can use macros or templates to generate the Creator objects. We present a C++ template based version as a type-safe solution. An analysis of the Creator s responsibilities leads us to the following definition of a Creator and ConcreteCreator template: template<class ProductType, class SpecType> class Creator { public: Creator(SpecType aspec) : _aspecification(aspec) { SpecType getspecification() { return _aspecification; ProductType * create() =0; private: SpecType _aspecification; ; template<class ProductType, class ConcreteProductType, class SpecType> class ConcreteCreator : public Creator<ProductType, SpecType> { public: ConcreteCreator(SpecType aspec) : Creator<ProductType, SpecType>(aSpec) { ProductType * create() { return new ConcreteProductType; 7KH&UHDWRUWHPSODWHUHTXLUHVWZRIRUPDODUJXPHQWVWKH3URGXFW7\SHDQGWKH6SHF7\SH VSHFLILFDWLRQ W\SH 8VXDOO\ WKH 6SHFLILFDWLRQ LWVHOI LV QRW PDLQWDLQHG E\ WKH &UHDWRU UDWKHU LW LV WKH DUJXPHQW IRU WKH PDSSLQJ ZKLFK OHDGV WR WKH &UHDWRU LQ WKH ILUVW SODFH +RZHYHUIRUPDQDJHPHQWSXUSRVHVLQ3URGXFW7UDGHUVLWLVFRQYHQLHQWWRVWRUHDVSHFLIL FDWLRQZLWKWKH&UHDWRUJLYHQWKDWWKHUHLVRQO\DVLQJOHVSHFLILFDWLRQZKLFKOHDGVWRWKH VSHFLILF&UHDWRU(YHQWXDOO\WKH&RQFUHWH&UHDWRUWHPSODWHDGGVWKHFRGHIRUDFWXDOO\FUH DWLQJDQLQVWDQFHRID&RQFUHWH3URGXFWFODVV $FORVHUORRNDWWKHWHPSODWHVUHYHDOVWKDWWKH\DUHIDLUO\VLPSOHHVVHQWLDOO\RQO\GHILQLQJ LQWHUIDFHVDQGWKHFUHDWHRSHUDWLRQIRUFRQFUHWHSURGXFWFODVVHV7KHVHWHPSODWHVFDQRQO\ EH XVHG IRU SURGXFW FODVVHV ZKHUH WKH FRQVWUXFWRU GRHVQ W QHHG DQ\ SDUDPHWHUV,Q FDVH WKDWSDUDPHWHUVPXVWEHSDVVHGWRWKH3URGXFWFODVVFRQVWUXFWRUDGGLWLRQDOWHPSODWHVDUH QHHGHG$UHSOLFDWLRQRIWKHDERYHWZRWHPSODWHFODVVHVLVWKHUHVXOW

,PSOHPHQWLQJ6SHFLILFDWLRQV6SHFLILFDWLRQVFDQEHUHDOL]HGHLWKHUGLUHFWO\LQWKHSDUDPHWHUV RIWKHFUHDWLRQRSHUDWLRQE\VRPHSULPLWLYHYDOXHW\SHVRUE\HQFDSVXODWLQJWKHPDVFODVVHV RIWKHLURZQ7KLVLVVXHDIIHFWVWKHLPSOHPHQWDWLRQRIWKHPDSSLQJ B 8VLQJ EXLOWLQ YDOXH W\SHV OLNH LQWHJHUV FKDUDFWHU VWULQJV HWF RIWHQ UHTXLUHV DGGLWLRQDO VXSSRUWOLNHIUHHIORDWLQJRSHUDWLRQVWRFRPSXWHKDVKFRGHVHWF(VVHQWLDOO\\RXPXVWGH ILQHRSHUDWLRQVZKLFKPDNHWKHYDOXHW\SHVXVDEOHDVORRNXSDUJXPHQWVIRUWKHPDSSLQJ B 8VLQJH[SOLFLW6SHFLILFDWLRQREMHFWVDOORZV\RXWRGHILQHWKHSURSHULQWHUIDFHIRUVSHFLIL FDWLRQV RQFH DQG UHXVH LW IRU HYHU\ QHZ VSHFLILFDWLRQ 0RUHRYHU 3URGXFW7UDGHUV FDQ EH ZULWWHQEDVHGRQWKLVH[SOLFLWLQWHUIDFHDQGUHXVHGDVZHOO6XFKD6SHFLILFDWLRQLQWHUIDFH PLJKWORRNOLNHWKLV class Specification { public: // returns Product class, that is the root class of classes // addressed by this type of specification virtual Class* getproductclass() =0; // initialize specification to match semantics of a given Product class virtual void initforproduct(class* pc) { this->adaptto(pc); // initialize specification to match semantics of a given Product class virtual void adaptto(class*); // match two specifications for equivalence virtual bool matches(specification*) =0; ; &RQILJXULQJIUDPHZRUNVDQGDSSOLFDWLRQV3URGXFW7UDGHUFUHDWHVREMHFWVRQO\LQGLUHFWO\E\ LQWHUSUHWLQJ VSHFLILFDWLRQV 7KXV &RQFUHWH3URGXFW FODVVHV DUH QRW GLUHFWO\ UHIHUHQFHG E\ IUDPHZRUNRUDSSOLFDWLRQFRGHEXWRQO\DEVWUDFWLQWHUIDFHVOLNH WKH 3URGXFW FODVV DUH $V D FRQVHTXHQFH\RXPXVWVSHFLI\H[SOLFLWO\ZKLFKFODVVHVDUHWREHOLQNHGWRDQDSSOLFDWLRQEH FDXVHOLQNHUVPLJKWQRWOLQNFODVVHVZKLFKDUHQRWGLUHFWO\UHIHUHQFHGE\FRGHUHDFKDEOHIURP VRPHURRWREMHFWRUPDLQ B 8VLQJPDNHILOHVLVDVWUDLJKWIRUZDUGDSSURDFK)RUHYHU\DSSOLFDWLRQ\RXH[SOLFLWO\VSHF LI\WKHVHWRI&RQFUHWH3URGXFWFODVVHVZKLFKDUHWREHOLQNHG<RXFDQGRVRE\LVVXLQJ FRPPDQGVWRWKHOLQNHU6LQFHGHSHQGHQFLHVEHWZHHQ&RQFUHWH3URGXFWFODVVHVIURPGLI IHUHQW FODVV KLHUDUFKLHV PLJKW H[LVW FRYDULDQW UHGHILQLWLRQ EH FDUHIXO QRW WR IRUJHW GH SHQGHQWFODVVHV B 8VLQJ VRXUFH FRGH WR FRQILJXUH V\VWHPV LV VWUDLJKWIRUZDUG DV ZHOO <RX PLJKW VLPSO\ ZULWHDFRQILJXUDWLRQRSHUDWLRQLQWKHV\VWHP VURRWFODVVWKHPDLQDSSOLFDWLRQFODVV RU FORVHWRWKHPDLQRSHUDWLRQZKLFKUHIHUHQFHVWKHFODVVHVUHTXLUHGWREHOLQNHGRQFH7KH OLQNHUZLOOWDNHFDUHWKHQWKDWWKHULJKWFODVVHVDUHOLQNHGWRWKHILQDOH[HFXWDEOH B 8VLQJUHJLVWHUREMHFWV,I\RXZDQWWRVXSSRUW3URGXFW7UDGHUIRUDOOFODVVHVOLQNHGWRWKH V\VWHP \RX VKRXOG FRQVLGHU XVLQJ 5HJLVWHU 2EMHFWV $Q REMHFW RI D UHJLVWHU FODVV LV UH VSRQVLEOHWRDGGD&RQFUHWH&UHDWRUREMHFWZLWKDVSHFLILFDWLRQWRWKH3URGXFWFODVV B 8VLQJFRQILJXUDWLRQVFULSWV,QODUJHSURMHFWVZKHUHDORWRIDSSOLFDWLRQVDUHGHYHORSHGLW LVLQGLVSHQVDEOHWKDWWKHFRQILJXUDWLRQRIWKHV\VWHPFDQEHXQGHUVWRRGHDVLO\:KHQXV LQJ3URGXFW7UDGHULQ&ZHUHFRPPHQGWKHXVHRIFRQILJXUDWLRQVFULSWV7KHJRDOVRI FRQILJXUDWLRQVFULSWVDUH * WRUHSUHVHQWRQHSODFHWKDWGHVFULEHVWKHFRQILJXUDWLRQRIWKHV\VWHP

* WRUHIHUHQFHDOOQHHGHG&RQFUHWH3URGXFWFODVVHVVRWKDWWKHOLQNHULQFOXGHVWKHPLQWR WKHDSSOLFDWLRQ $QHDV\ZD\WRVDWLVI\WKHVHJRDOVLVWRFUHDWHWKH&RQFUHWH&UHDWRUDQG6SHFLILFDWLRQRE MHFWVLQVLGHDFRQILJXUDWLRQVFULSWDQGDGGWKHVHREMHFWVWRWKH3URGXFWFODVVGHSHQGLQJRQ WKHQHHGHGFRQILJXUDWLRQRIWKHV\VWHP7KH6DPSOH&RGHVHFWLRQSUHVHQWVVRPHH[DP SOHV 3URYLGLQJFRQYHQLHQFHRSHUDWLRQV<RXFDQXVHWKHDEVWUDFW3URGXFWFODVVWRKLGHWKHLPSOH PHQWDWLRQRIDVSHFLILFDWLRQDVDQLQVWDQFHRIDGHGLFDWHG6SHFLILFDWLRQFODVV7KHFOLHQWVLP SO\ FDOOV WKH FUHDWH)RU RSHUDWLRQ ZLWK SDUDPHWHUV ZKLFK DUH QDWLYH WR WKH VSHFLILFDWLRQ DQG WKHLPSOHPHQWDWLRQRIFUHDWH)RULQWKH3URGXFWFODVVFRQYHUWVWKHVHSDUDPHWHUVLQWRD6SHFLIL FDWLRQREMHFW 3URYLGLQJ LQLWLDOL]DWLRQ SDUDPHWHUV 6RPHWLPHV REMHFWV UHTXLUH HODERUDWH LQLWLDOL]DWLRQ SD UDPHWHUVZKLFKPXVWEHDYDLODEOHGXULQJWKHHDUO\REMHFWEXLOGLQJSURFHVV7KHVHSDUDPHWHUV FDQEHSDFNDJHGLQWRWKH6SHFLILFDWLRQREMHFWVRUWKH\FDQEHSDVVHGDORQJDFKDLQRIRSHUD WLRQFDOOVZKLFKWKHQPXVWSURYLGHPDWFKLQJSDUDPHWHUOLVWVZKLFKDVNVIRUFRGHJHQHUDWLRQ DVGLVFXVVHGDERYH &RQVLGHUG\QDPLFOLQNOLEUDULHVH[SOLFLWO\&ODVVHVIURPG\QDPLFDOO\OLQNHGOLEUDULHVDUHQRW GLUHFWO\DFFHVVLEOHVLPSO\EHFDXVHWKH\DUHQRWFRQWDLQHGLQWKHUXQWLPHLPDJH+RZHYHUWKH FUHDWRUREMHFWVDUHXVXDOO\YHU\OLJKWZHLJKW7KH\DUHWKHUHIRUHDILQHPHDQVRIUHSUHVHQWLQJ QRW\HWORDGHGFODVVHV7KHFUHDWLRQSURFHGXUHRIDFUHDWRUIRUDFODVVLQDG\QDPLFDOO\OLQNHG OLEUDU\PLJKWKDYHWRORDGWKDWFODVVILUVWEXWWKLVPLJKWEHH[DFWO\ZKDW\RXZDQW&UHDWRUV DQGWKH3URGXFW7UDGHUFDQEHXVHGHIIHFWLYHO\WRKLGHWKHIDFWRULQJRIODUJHDSSOLFDWLRQVLQWR '// VRQWKHH[SHQVHRIKDYLQJWRGHDOZLWKFRPSOH[FRQILJXUDWLRQVLVVXHV SAMPLE CODE Instantiating objects from a stream $VDILUVWH[DPSOHZHZLOOSUHVHQWDVLPSOHLPSOHPHQWDWLRQXVLQJSURWRW\SHVDV&UHDWRUVDQGD GLFWLRQDU\ DV WKH PDSSLQJ IURP 6SHFLILFDWLRQ WR&RQFUHWH&UHDWRU 7KH GLFWLRQDU\ LV PDLQWDLQHG E\WKH3URGXFWFODVV $VVXPH\RXDUHUHDGLQJREMHFWVIURPDVWUHDP$OHDGLQJVWULQJLQGLFDWHVWKHFODVVRIWKHREMHFW WREHUHDG7KXVWKHFODVVQDPHUHSUHVHQWVWKHVSHFLILFDWLRQIRUWKHFODVVWREHLQVWDQWLDWHGDQG ZHXVH3URGXFW7UDGHUWRGRVR 6HULDOL]DEOH LV WKH DEVWUDFW 3URGXFW FODVV IRU DOO REMHFWV WKDW FDQ EH UHDG IURP D VWUHDP 6WULQJLVWKHVSHFLILFDWLRQW\SHDQGZHDVVXPHWKDWHYHU\VXEFODVVRI6HULDOL]DEOHFDQSURYLGH DSURWRW\SH 7KH6HULDOL]DEOHFODVVPLJKWWKHQLPSOHPHQWFUHDWH)RUOLNHWKLV Serializable* Serializable::createFor(String& classname) { Serializable* prototype = lookup(classname); return prototype->clone();

/RRNXSVLPSO\UHWULHYHVWKHSURWRW\SHIRUDJLYHQFODVVQDPHIURPDGLFWLRQDU\PDLQWDLQHGE\WKH 3URGXFWFODVVDVWDWLFPHPEHUYDULDEOHLQ&RUDFODVVYDULDEOHLQ6PDOOWDON Serializable* Serializable::lookup(String& classname) { return mapping[classname]; $VLPSOHFRQILJXUDWLRQVFKHPHPLJKWEHWRPDNHWKHSURWRW\SHVUHJLVWHUWKHPVHOYHVDWWKH6H ULDOL]DEOHFODVVGXULQJV\VWHPVWDUWXSWLPHZKHQWKHSURWRW\SHVDUHFUHDWHG Customer::Customer(CustomerPrototypeConstructorIndicator* dummy) { Serializable::addCreator(this); 6HULDOL]DEOHLPSOHPHQWVDGG&UHDWRUE\XVLQJWKHFODVVQDPHWRSXWWKHSURWRW\SHLQWRWKHGLF WLRQDU\ Serializable::addCreator(Serializable* prototype) { mapping[prototype->getclassname()] = prototype; 7KLVLPSOHPHQWDWLRQXVHVSURWRW\SHVDV&UHDWRUVDVLPSOHEXLOWLQYDOXHW\SHVSHFLILFDWLRQDQGD VWDWLFUHJLVWHULQJDQGFRQILJXUDWLRQVFKHPH,WLVDUDWKHUOLJKWZHLJKWDSSURDFKZKLFKZRUNVZHOO LI 3URGXFW 7UDGHU LV WR EH DSSOLHG WR VLQJOH FODVV KLHUDUFKLHV ZLWK RQO\ VLPSOH VSHFLILFDWLRQ UH TXLUHPHQWV Configuring widgets for value types $VDVHFRQGH[DPSOHZHZLOOXVH&WHPSODWHVWRLOOXVWUDWHDQLPSOHPHQWDWLRQRIWKHLQWURGXF LQJGRPDLQZLGJHWDQGYDOXHSUREOHP,QWKLVH[DPSOHVSHFLILFDWLRQVDUHUHDOL]HGE\&typeid V GHQRWLQJ WKH FODVV RI WKH 'RPDLQ9DOXH 7KH FRQILJXUDWLRQ VFKHPH RI WKH V\VWHP LV UHDOL]HGE\FRQILJXUDWLRQVVFULSWV7KHPDSSLQJIURPWKH6SHFLILFDWLRQWRWKH&UHDWRULVUHDOL]HG E\DVLPSOHGLFWLRQDU\ :HXVHWKHWHPSODWHVIURPWKH,PSOHPHQWDWLRQVHFWLRQ DomainWidget* DomainWidget::createFor(DomainValue* avalue) { Creator<DomainWidget, type_info&>* acreator = mapping[typeid(avalue)]; return acreator->create(); DomainWidget::addCreator(Creator<DomainWidget, type_info&>* acreator) { mapping[acreator->getspecification()] = acreator; :HXVHWKHWHPSODWHVIURPWKHLPSOHPHQWDWLRQVHFWLRQWRFRQILJXUHWKHDomainWidgetFODVV,WPDSVWKHW\SHLGRIWKH'RPDLQ9DOXHVWRWKH&UHDWRUREMHFWIRUWKH'RPDLQ:LGJHWV StandardDomainWidgetConfiguration() {... // map Amount on AmountWidget DomainWidget::addCreator( new ConcreteCreator<DomainWidget, AmountWidget, type_info&>( typeid(amount))); // map Currency on CurrenyWidget DomainWidget::addCreator( new ConcreteCreator<DomainWidget, CurrencyWidget, type_info&>( typeid(currency)));...

,IZHZDQWWRRIIHUDQHZFRQILJXUDWLRQIRUDQDSSOLFDWLRQZHRQO\KDYHWRZULWHDQQHZFRQILJX UDWLRQVFULSWWRPDNHWKHUHTXLUHGFKDQJHV$VDQH[DPSOHFRQVLGHUDFUHGLWDSSOLFDWLRQZKLFK XVHVDVSHFLDOGRPDLQZLGJHWIRUWKHGRPDLQYDOXHAmount7RDGGWKHQHZZLGJHWWRWKHDSSOL FDWLRQ\RXKDYHWRLPSOHPHQWWKHQHZGRPDLQZLGJHWDQGWKHQXVHDFRQILJXUDWLRQVFULSWWRUHJ LVWHULW7KHQHZFRQILJXUDWLRQVFULSWPLJKWORRNOLNHWKLV CreditConfiguration() {... // use the specific CreditAmountWidget for the domain value Amount DomainWidget::substituteCreator( new ConcreteCreator<DomainWidget, CreditAmountWidget, type_info&>( typeid(amount)));... 7KHV\VWHP VURRWREMHFWRU WKH PDLQ RSHUDWLRQ PXVW FDOO WKH DomainWidgetConfiguration DQG WKH CreditConfiguration RSHUDWLRQ WR LQVWDOO WKH QHFHVVDU\ &UHDWRU REMHFWV 2QO\WKHVHFDOOVDUHQHHGHGQRIXUWKHUFRGHFKDQJHVDUHUHTXLUHG Using a general ProductTrader $VDILQDOH[DPSOHZHZLOOXVH6PDOOWDONWRLPSOHPHQWDIXOO3URGXFW7UDGHUWKDWFDQEHUHXVHG E\HYHU\FODVVKLHUDUFK\WKDWZDQWVWRSURYLGH3URGXFW7UDGHUDWLWVURRWIRUDQ\QXPEHURIGLIIHU HQWVSHFLILFDWLRQV7KLVH[DPSOHLVGHULYHGIURP>5LHKOH@ZKHUHDPRUHGHWDLOHGGLVFXVVLRQ FDQEHIRXQG7KLVLPSOHPHQWDWLRQXVHVDJHQHUDO3URGXFW7UDGHUZKLFKPDLQWDLQVDSLFWXUHRIWKH VHPDQWLFVRIDOOFODVVHVLQWKHV\VWHPE\PHDQVRIVSHFLILFDWLRQV7KH3URGXFW7UDGHURUJDQL]HV WKHVHVSHFLILFDWLRQVVRWKDWLWFDQHDVLO\ORRNXSWKHFODVVHVPDWFKLQJDJLYHQVSHFLILFDWLRQ (YHU\ 3URGXFW FODVV FDQ SURYLGH FRQYHQLHQFH RSHUDWLRQV IRU 3URGXFW 7UDGHU ZKLFK DUH LPSOH PHQWHG LQ WHUPV RI WKH V\VWHPZLGH 3URGXFW7UDGHU D 6LQJOHWRQ &ODVVHV WDNH RYHU WKH UROH RI &UHDWRUV6SHFLILFDWLRQVDUHLPSOHPHQWHGDVVXEFODVVHVRIDJHQHUDO6SHFLILFDWLRQFODVVDQGWKH 3URGXFW7UDGHULVUHDOL]HGE\WKH3URGXFW7UDGHUMXVWLQWURGXFHG 7KH 3URGXFW7UDGHU SURYLGHV D PDSSLQJ IURP D VSHFLILFDWLRQ WR D FODVV REMHFW IRU HYHU\ VSHFLILFDWLRQ W\SH 6SHFLILFDWLRQ W\SHV DUH UHSUHVHQWHG E\ WKH FODVVHV LQ D 6SHFLILFDWLRQ FODVVKLHUDUFK\7KHPDSSLQJLVLPSOHPHQWHGDVDGLFWLRQDU\ZKLFKWDNHVD6SHFLILFDWLRQLQVWDQFH DVDNH\DQGUHWXUQVDFROOHFWLRQRIDOOFODVVHVWKDWPDWFKWKHVSHFLILFDWLRQ6LQFHWKHVSHFLILFDWLRQ W\SHLVUHSUHVHQWHGDVDFODVVLWFDQEHXVHGLQDIXUWKHUGLFWLRQDU\WRUHWULHYHWKHGLFWLRQDU\FRQ WDLQLQJWKHVSHFLILFDWLRQWRFODVVHVPDSSLQJ 7KH3URGXFW7UDGHUKDVWZRPDLQORRNXSPHWKRGV ProductTrader>>getSpecificationDictionary: aclass "returns dictionary representing a specification to classes mapping" ( self spectypedict includeskey: aclass ) iftrue: [ ^self spectypedict at: aclass ] iffalse: [ ^nil ] ProductTrader>>getClassCollection: aspecification "returns collection of classes matching aspecification" specdict specdict := self getspecificationdictionary: aspecification class. ( specdict includeskey: aspecification ) iftrue: [ ^self specdict at: aspecification ] iffalse: [ ^nil ]

7KH ILUVW PHWKRG UHWXUQV WKH PDSSLQJ GLFWLRQDU\ IRU D JLYHQ VSHFLILFDWLRQ W\SH DQG WKH VHFRQG PHWKRGUHWXUQVDFROOHFWLRQRIDOOFODVVHVPDWFKLQJWKHJLYHQVSHFLILFDWLRQ7KHLPSOHPHQWDWLRQ RIFUHDWH)RUEHFRPHVDVLPSOHWZRVWDJHUHWULHYDOSURFHVVQRZ$SURGXFWFODVVIRUH[DPSOH 'RPDLQ:LGJHWVLPSO\GRHVWKHIROORZLQJ DomainWidget>>createFor: adomainvalue "create Specification instance and delegate to ProductTrader" aspecification aspecification := DomainWidgetSpecification new: adomainvalue class. ^self ProductTrader createfor: aspecification ProductTrader>>createFor: aspecification "create object for given specification" classcol classcol := getclasscollection: aspecification. ( classcol notnil ) iftrue: [ ^classcol first new ] iffalse: [ ^nil ] 7KHDFWXDOSUREOHPLVKRZWRVHWXSWKHGLFWLRQDULHVVRWKDWWKHUHWULHYDODQGFUHDWLRQSURFHVVFDQ EHFDUULHGRXWHDVLO\7KLVLVDWZRVWHSSURFHVV,QWKHILUVWVWHSWKH3URGXFW7UDGHUFROOHFWVDOO FODVVHVIURPWKH6SHFLILFDWLRQ FODVV KLHUDUFK\,Q WKH VHFRQG VWHS LW FDOFXODWHV WKH PDSSLQJ IRU HYHU\ 6SHFLILFDWLRQ FODVV WKLV LV GRQH E\ WUDYHUVLQJ WKH SURGXFW FODVV KLHUDUFK\ DV LQGLFDWHG E\ WKH6SHFLILFDWLRQFODVVDQGE\FUHDWLQJD6SHFLILFDWLRQLQVWDQFHIRUHYHU\3URGXFWFODVV 7KLVSURFHVVLVEDVHGRQLQIRUPDWLRQZKLFKKDVWREHSURYLGHGE\WKHVSHFLILFDWLRQFODVVHVWKHP VHOYHV7KXV6SHFLILFDWLRQGHFODUHVWKHIROORZLQJFODVVDQGLQVWDQFHPHWKRGV Specification class>>getproductclass "returns Product class" self subclassresponsibility Specification class>>newfromclient: anobject "used by clients which supply the specification information" self subclassresponsibility Specification class>>newfrommanager: aclass "used by ProductTrader to instantiate spec for a ConcreteProduct class ^super new adaptto: aclass Specification>>adaptTo: aclass "adapts spec instance to given product class" self subclassresponsibility Specification>>matches: aspecification "matches with another specification" ^( self class = aspecification class ) 7KHVHPHWKRGVPXVWEHRYHUZULWWHQE\VXEFODVVHVLQRUGHUWRILWDFHUWDLQVSHFLILFDWLRQ VVHPDQ WLFV)RU'RPDLQ:LGJHW6SHFLILFDWLRQWKLVOHDGVWRWKHIROORZLQJFRGH DomainWidgetSpecification class>>getproductclass ^DomainWidget DomainWidgetSpecification class>>newfromclient: adomainvalueclass self domainvalueclass: adomainvalueclass DomainWidgetSpecification>>adaptTo: adomainwidgetclass self domainvalueclass: adomainwidgetclass getdomainvalueclass DomainWidgetSpecification>>matches: aspecification ( super matches: aspecification ) iffalse: [ ^false ]. ^( self domainvalueclass = aspecification domainvalueclass ) DomainWidgetSpecification>>hash

^domainvalueclass symbol :KHQ FUHDWHG E\ D FOLHQW RU D FRQYHQLHQFH RSHUDWLRQ RI 'RPDLQ:LGJHW WKH 'RPDLQ:LGJHW 6SHFLILFDWLRQLQVWDQFHUHFHLYHV WKH'RPDLQ9DOXH FODVV WKH QHZ'RPDLQ:LGJHW LQVWDQFH ZLOO KDYHWRILW:KHQFUHDWHGE\WKH3URGXFW7UDGHUWKH'RPDLQ:LGJHW6SHFLILFDWLRQLQVWDQFHLVFUH DWHG IRU D VSHFLILF 'RPDLQ:LGJHW FODVV ZKLFK LW DVNV IRU WKH 'RPDLQ9DOXH FODVV LW KDV EHHQ ZULWWHQIRU7KHODVWPHWKRGLVXVHGWREXLOGWKHPDSSLQJRIGRPDLQYDOXHVWRGRPDLQZLGJHWV 7KH3URGXFW7UDGHUWUDYHUVHVWKH'RPDLQ:LGJHWFODVVKLHUDUFK\FUHDWHVD'RPDLQ:LGJHW6SHFL ILFDWLRQLQVWDQFHIRUHDFKFODVVDQGSXWVWKHFODVVLQWRWKHPDSSLQJGLFWLRQDU\ZLWKWKHVSHFLILFD WLRQLQVWDQFHDVWKHNH\7KHKDVKPHWKRGWKHQPDSVDFOLHQWFUHDWHG'RPDLQ:LGJHW6SHFLILFDWLRQ LQVWDQFHRQDFROOHFWLRQRI'RPDLQ:LGJHWFODVVHV 7KLV DSSURDFK LV EDVHG RQ WKH DVVXPSWLRQ WKDW WKH VSHFLILFDWLRQ LQVWDQFH LV DEOH WR UHWULHYH HQRXJKLQIRUPDWLRQIURPWKH3URGXFWFODVVWRVHUYHDVDNH\LQWKHPDSSLQJ,QRXUH[DPSOHWKH 'RPDLQ:LGJHW FODVV SURYLGHV D JHW'RPDLQ9DOXH&ODVV PHWKRG ZKLFK UHWXUQV WKH GR PDLQYDOXHFODVV,IWKLVLVQRWDQRSWLRQWKHFODVVVHPDQWLFVRI3URGXFWFODVVHVPXVWEHVSHFLILHG H[WHUQDOWRWKDWFODVVIRUH[DPSOHLQDGDWDEDVH 7KLV DSSURDFK OHWV XV LQWURGXFH QHZ VSHFLILFDWLRQV VLPSO\ E\ LQWURGXFLQJ D QHZ VSHFLILFDWLRQ VXEFODVV,PSOHPHQWLQJ3URGXFW7UDGHUIRUREMHFWVWUHDPLQJDVVKRZQLQWKHILUVWH[DPSOHFDQEH GRQHE\FUHDWLQJD&ODVV6\PERO6SHFLILFDWLRQZKLFKORRNVOLNHWKLV ClassSymbolSpecification class>>getproductclass ^Object ClassSymbolSpecification class>>newfromclient: asymbol self classsymbol: asymbol ClassSymbolSpecification>>adaptTo: aclass self classsymbol: aclass symbol ClassSymbolSpecification>>matches: aspecification ( super matches: aspecification ) iffalse: [ ^false ]. ^( self classsymbol = aspecification classsymbol ) ClassSymbolSpecification>>hash ^classsymbol 7KH JHQHUDO 3URGXFW7UDGHU LV D PLJKW\ DSSURDFK IRU DYRLGLQJ WKH KDUGFRGLQJ RI FUHDWLRQ GH SHQGHQFLHVLQWKHFODVVLPSOHPHQWDWLRQVWKHPVHOYHV,WKDVVHUYHGXVZHOOLQPDNLQJRXUIUDPH ZRUNVHDVLHUDGDSWDEOHDQGFRQILJXUDEOH KNOWN USES 7KHILUVWH[DPSOHLQWKH6DPSOH&RGHVHFWLRQFUHDWLQJ REMHFWV IURP D VWUHDP FDQ EH IRXQG LQ DOPRVWHYHU\DSSOLFDWLRQIUDPHZRUNZKLFKSURYLGHVVWUHDPLQJVXSSRUW,WUHTXLUHVWKHPDSSLQJ IURPVRPHFODVVLGHQWLILHUIRUH[DPSOHWKHFODVVQDPHWRDQREMHFWZKLFKLVFDSDEOHRILQVWDQWL DWLQJWKLVFODVV<RXFDQLPSOHPHQWWKHVSHFLILFDWLRQDVDVWULQJUHSUHVHQWLQJWKHFODVVQDPHWKH FUHDWRUREMHFWVE\VRPHFODVVREMHFWRUSURWRW\SHDQGWKHPDSSLQJDVDGLFWLRQDU\ZKLFKPDSV WKH FODVV QDPH RQ WKH REMHFW UHSUHVHQWLQJ WKH FODVV )RU H[DPSOH WKH &ODVV0DQDJHU RI (7 >:HLQDQG@LPSOHPHQWV3URGXFW7UDGHUE\PDLQWDLQLQJFODVVREMHFWVLQDGLFWLRQDU\DQGVRGR WKH7RROVDQG0DWHULDOV0HWDSKRU)UDPHZRUNV>5LHKOH5LHKOH@ 1H[W WR WKLV YHU\ IUHTXHQW EXW VSHFLDOL]HG DSSOLFDWLRQ 3URGXFW 7UDGHU LV RIWHQ XVHG WR VHOHFW D VXEFODVVDVDVSHFLILFLPSOHPHQWDWLRQRIWKHDEVWUDFW3URGXFWFODVVZKLFKIXOILOOVFHUWDLQFULWHULD

IRU H[DPSOH SHUIRUPV YHU\ IDVW RU XVHV RQO\ D OLPLWHG DPRXQW RI PHPRU\ UHVRXUFHV/RUW] DQG 6KLQ>/RUW]@LPSOHPHQW3URGXFW7UDGHUDFFRUGLQJWR&RSOLHQ VJHQHULFDXWRQRPRXVH[HPSODU LGLRP>&RSOLHQ@7KH3URGXFWFODVVPDLQWDLQVDOLVWRISURWRW\SHVIRUHDFKRILWVVXEFODVVHVLW XVHVVWULQJVDVDVSHFLILFDWLRQPHFKDQLVPDQGLWWUDYHUVHVWKHOLVWPDWFKLQJHDFKSURWRW\SHZLWK WKH VSHFLILFDWLRQ /RUW] DQG 6KLQ XVH 3URGXFW 7UDGHU WR VHOHFW FRQWDLQHU FODVVHV EDVHG RQ SHU IRUPDQFHUHTXLUHPHQWVLQWKHFRQWH[WRIDUHDOWLPHGDWDEDVHV\VWHP 7KHPRVWLQWHUHVWLQJDSSOLFDWLRQRI3URGXFW7UDGHUKRZHYHULVWKHFUHDWLRQRIREMHFWVIURPRQH KLHUDUFK\GHSHQGLQJRQREMHFWVIURPDQRWKHUKLHUDUFK\DVGHPRQVWUDWHGE\ WKH LQWURGXFLQJ H[ DPSOH,Q WKH 7RROV DQG 0DWHULDOV 0HWDSKRU IUDPHZRUNV >%lxphu 5LHKOH 5LHKOH@ ZH KDYH PDGH H[WHQVLYH XVH RI WKH SDWWHUQ WR PDS KLHUDUFKLHV RQWR HDFK RWKHU :H LQVWDQWLDWH ZLGJHWVGHSHQGLQJRQYDOXHW\SHVZHLQVWDQWLDWHXVHULQWHUIDFHSDUWVGHSHQGLQJRQGRPDLQPRG HOVZHLQVWDQWLDWHWRROVGHSHQGLQJRQWKHPDWHULDOVWKH\KDYHWRZRUNRQDQGZHLQVWDQWLDWHGR PDLQFRPSRQHQWVGHSHQGLQJRQRWKHUGRPDLQFRPSRQHQWV $OOWKHVHWDVNVDUHFDUULHGRXWRQWKHOHYHORIDEVWUDFWFODVVHV7KLVKHOSHGXVDFKLHYHDGHJUHHRI GHFRXSOLQJWKDWVLJQLILFDQWO\HDVHGV\VWHPHYROXWLRQDQGFRQILJXUDWLRQ3URGXFW7UDGHULVDQLP SRUWDQWDVVHWLQPDNLQJWKHIUDPHZRUNVFRQVLVWLQJRIPRUHWKDQFODVVHVDGDSWDEOHFRQILJ XUDEOHDQGHYHQWXDOO\PDQDJHDEOH RELATED PATTERNS 7KHJOREDO3URGXFW7UDGHULVD6LQJOHWRQ>*DPPD@3URGXFW7UDGHULVXVHGWRFUHDWHREMHFWV IURPDVWUHDPLQWKH$WRPL]HUSDWWHUQ>5LHKOH@&RQYHQLHQFHRSHUDWLRQVXVHGWRHQFDSVXODWH FRPSOH[ 6SHFLILFDWLRQ REMHFWV DUH DQ H[DPSOH RI WKH &RQYHQLHQFH 0HWKRG SDWWHUQ >+LU@ 3URGXFW 7UDGHU LV XVHG WR FUHDWH &RQFUHWH([WHQVLRQ REMHFWV IRU &RQFUHWH6XEMHFW REMHFWV LQ WKH ([WHQVLRQ2EMHFWVSDWWHUQ>*DPPD@ 3URGXFW 7UDGHU VHUYHV DV D FRPSDQLRQ WR)DFWRU\ 0HWKRG >*DPPD@ 3URGXFW 7UDGHU ZRUNV ZHOOZKHUH)DFWRU\0HWKRGZRUNVSRRUO\DQGYLFHYHUVD)DFWRU\0HWKRGVRIWHQLQWURGXFHF\FOLF GHSHQGHQFLHVEHWZHHQWKH3URGXFWDQGWKH&UHDWRULQSDUWLFXODULIWKH3URGXFWLVJRLQJWRZRUN RQWKH&UHDWRUODWHURQ7KLVLVWKHFDVHZLWKDSSO\LQJ)DFWRU\0HWKRGLQWKHLQWURGXFWRU\H[DP SOHZKHUHDYDOXHREMHFWZRXOGFUHDWHDZLGJHWREMHFW7KLVLVWKHFDVHZLWKDFRQWDLQHUFUHDWLQJ LWVLWHUDWRUV7KLVLVWKHFDVHZLWKDPRGHOREMHFWFUHDWLQJLWVYLHZV,IDGLIIHUHQWSURGXFWLVUH TXLUHGWKHFUHDWRUKDVWREHFKDQJHG7KHZLGJHWFODVVWKHFRQWDLQHUFODVVDQGWKHPRGHOFODVV ZRXOG KDYH WR EH FKDQJHG)XUWKHUPRUH QR WZR GLIIHUHQW SURGXFWV FDQ FRH[LVW DQG EH VHOHFWHG GXHWRVRPHG\QDPLFVHOHFWLRQFULWHULD :HWKLQNRI3URGXFW7UDGHUDVDWKLUGIXQGDPHQWDOFUHDWLRQDOSDWWHUQQH[WWR)DFWRU\0HWKRGDQG 3URWRW\SH ACKNOWLEDGMENTS :H ZLVK WR WKDQN RXU VKHSKHUG DQG WKH SDUWLFLSDQWV RI WKH ZULWHU V ZRUNVKRS DW 3/R3 IRU WKHLUKHOSIXOFRPPHQWV

REFERENCES >%lxphu@'%lxphu**u\f]dq5.qroo&/lolhqwkdo&5lhkohdqg+= OOLJKRYHQ ³7KH7RROVDQG0DWHULDOV0HWDSKRU6HULHVRI)UDPHZRUNV 6XEPLWWHGIRUSXEOLFDWLRQ >&RSOLHQ@-2&RSOLHQ$GYDQFHG&3URJUDPPLQJ6W\OHVDQG,GLRPV5HDGLQJ0$ $GGLVRQ:HVOH\ >*DPPD@(*DPPD³)DFHW 7KLVYROXPH >*DPPD@(*DPPD5+HOP5-RKQVRQDQG-9OLVVLGHV'HVLJQ3DWWHUQV(OHPHQWVRI 5HXVDEOH'HVLJQ5HDGLQJ0$$GGLVRQ:HVOH\ >/RUW]@9%/RUW]DQG.*6KLQ³&RPELQLQJ&RQWUDFWVDQG([HPSODU%DVHG3URJUDP PLQJIRU&ODVV+LGLQJDQG&XVWRPL]DWLRQ,Q3URFHHGLQJVRI2236/$ $&06,*3/$1 1RWLFHV2FWREHU3DJH >5LHKOH@'5LHKOHDQG+= OOLJKRYHQ³$3DWWHUQ/DQJXDJHIRU7RRO&RQVWUXFWLRQDQG,QWH JUDWLRQ%DVHGRQWKH7RROVDQG0DWHULDOV0HWDSKRU,Q-2&RSOLHQDQG'&6FKPLGWHGV 3DWWHUQ/DQJXDJHVRI3URJUDP'HVLJQ5HDGLQJ0$$GGLVRQ:HVOH\3DJH >5LHKOH@'LUN5LHKOH%UXQR6FKlIIHUDQG0DUWLQ6FKQ\GHU³'HVLJQRID6PDOOWDON)UDPH ZRUNIRUWKH7RROVDQG0DWHULDO0HWDSKRU,QIRUPDWLN,QIRUPDWLTXH)HEUXDU\3DJH >5LHKOH@'LUN5LHKOH:ROI6LEHUVNL'LUN%lXPHU'DQLHO0HJHUW+HLQ]= OOLJKRYHQ³6HUL DOL]HU 7KLVYROXPH >:HLQDQG@$QGUp:HLQDQGDQG(ULFK*DPPD³(7²D3RUWDEOH+RPRJHQRXV&ODVV /LEUDU\DQG$SSOLFDWLRQ)UDPHZRUN,Q:5%LVFKRIEHUJHUDQG+3)UHLHGV3URFHHGLQJV RIWKH8ELODE&RQIHUHQFH = ULFK.RQVWDQ]8QLYHUVLWlWVYHUODJ.RQVWDQ]3DJH &RS\ULJKW 'LUN%lXPHUDQG'LUN5LHKOH$OO5LJKWV5HVHUYHG 'LUN%lXPHU ZRUNV IRU 5:**PE+*HUPDQ\ +H FDQ EH UHDFKHG DW 5:**PE+ 5lSSOHQ VWUD H 6WXWWJDUW *HUPDQ\ +H LV LQWHUHVWHG LQ REMHFWRULHQWHG IUDPHZRUNV VRIWZDUH DUFKLWHFWXUHDQGGLVWULEXWHGV\VWHPV+HZHOFRPHVHPDLODW'LUNB%DHXPHU#UZJHPDLOFRPRU EDHXPHU#LQIRUPDWLNXQLKDPEXUJGH 'LUN5LHKOHZRUNVDW8ELODEWKHLQIRUPDWLRQWHFKQRORJ\UHVHDUFKODERUDWRU\ RI 8QLRQ%DQN RI 6ZLW]HUODQG+HLVLQWHUHVWHGLQREMHFWRULHQWHGIUDPHZRUNVVRIWZDUHDUFKLWHFWXUHDQGGLVWULEXWHG V\VWHPV+HFDQEHUHDFKHGDW8QLRQ%DQNRI6ZLW]HUODQG%DKQKRIVWUDVVH&+= ULFK +HZHOFRPHVHPDLOIHHGEDFNDW'LUN5LHKOH#XEVFRPRUULHKOH#DFPRUJ