<?xml version="1.0" encoding="UTF-8"?>
<DesignPattern xmlns="http://www.alshayeb.com/DPDL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.alshayeb.com/DPDL/DPDLSchema.xsd" PatternName="Factory Method Template">
	<StructuralAttributes>
		<Classes>
			<SubGroup groupID="ClientClasses" noOfClasses="1ToMany">
				<Class className="Client" isAbstract="Yes" classModifier="public" hasConstructor="Yes" isDerived="No" isParent="Yes"/>
			</SubGroup>		
			<SubGroup groupID="ParentProduct" noOfClasses="1">
				<Class className="Product" isAbstract="Yes" isParent="Yes"></Class>
			</SubGroup>
			<SubGroup groupID="cncProduct" noOfClasses="1ToMany">
				<Class className="ConcreteProduct" isAbstract="No" isDerived="Yes" parentId="Product"></Class>
			</SubGroup>
			<SubGroup groupID="ParentCreator" noOfClasses="1">
				<Class className="Creator" isAbstract="Yes" isParent="Yes"></Class>
			</SubGroup>
			<SubGroup groupID="cncCreator" noOfClasses="1ToMany">
				<Class className="ConcreteCreator" isAbstract="No" isDerived="Yes" parentId="Creator"></Class>
			</SubGroup>
		</Classes>
		<Operations>
			<SubGroupOp groupID="fmCreator" noOfOperations="1">
				<Function containingClassId="Creator" functionName="FactoryMethod" functionModifier="public" isAbstract="Yes" inputVariablesIds="null" inputVariablesType="null" returnType="Product"></Function>
			</SubGroupOp>
			<SubGroupOp groupID="fmCncCreator" inEach="class" inGroupID="cncCreator">
				<Function containingClassId="ConcreteCreator" functionName="FactoryMethod" functionModifier="public" isOverRide="Yes" inputVariablesIds="null" inputVariablesType="null" returnType="Product"></Function>
			</SubGroupOp>
		</Operations>
		<Objects>
			<SubgroupOb groupID="ClientObjects" inEach="class" inGroupID="ClientClasses">
				<Object objectName="creators" objectClass="Creator" containingClass="Client" isList="Yes" ListType="Array"></Object>
				<Object objectName="product" objectClass="Product" containingClass="Client" isList="No"></Object>
			</SubgroupOb>
		</Objects>		
		<RelationShips>
			<SubgroupR groupID="rsCncProduct" forEach="class" inGroupID="cncProduct" changingClass="initiatingClass">
				<Relation relationName="Generalization" initiatingClass="ConcreteProduct" endClass="Product"></Relation>
			</SubgroupR>
			<SubgroupR groupID="rsCncCreator" forEach="class" inGroupID="cncCreator" changingClass="initiatingClass">
				<Relation relationName="Generalization" initiatingClass="ConcreteCreator" endClass="Creator"></Relation>
			</SubgroupR>
			<SubgroupR groupID="rsCnCProdCreator" forEach="pair" inGroupID="{cncCreator,cncProduct}" changingClass="{initiatingClass, endClass}">
				<Relation relationName="Dependency" initiatingClass="ConcreteCreatorA" endClass="ConcreteProductA"></Relation>
			</SubgroupR>
		</RelationShips>
	</StructuralAttributes>
	<BehavioralAttributes>
		<create callingClass="MainApp" returns="Creator" Collection="True" ObjectId="creators" objectClass="Creator" createType="No"></create>
		<SetObject ObjectId="creators.0" ObjectClass="Creator" SetTo="ConcreteCreator" CallingClass="MainApp" SetType="Class" ForEach="Class" inGroupId="cncCreator" ></SetObject>
		<loop Function="Main" numberOfIteration="for each creator" Class="MainApp">
			<create callingClass="MainApp" returns="Product" Collection="No" ObjectId="product" objectClass="Product" createType="new"></create>
		</loop>
	</BehavioralAttributes>
</DesignPattern>
