<?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">
	<StructuralAttributes>
		<Classes>
			<SubGroup groupID="ClientClass" noOfClasses="1">
				<Class className="Client" isAbstract="Yes" classModifier="public" hasConstructor="Yes" isDerived="No" isParent="Yes"/>
			</SubGroup>		
			<SubGroup groupID="ProductClass" noOfClasses="1">
				<Class className="Product" isAbstract="Yes" isParent="Yes"></Class>
			</SubGroup>
			<SubGroup groupID="ConcreteProductAClass" noOfClasses="1">
				<Class className="ConcreteProductA" isAbstract="No" isDerived="Yes" parentId="Product"></Class>
			</SubGroup>
			<SubGroup groupID="ConcreteProductBClass" noOfClasses="1">
				<Class className="ConcreteProductB" isAbstract="No" isDerived="Yes" parentId="Product"></Class>
			</SubGroup>			
			<SubGroup groupID="CreatorClass" noOfClasses="1">
				<Class className="Creator" isAbstract="Yes" isParent="Yes"></Class>
			</SubGroup>
			<SubGroup groupID="ConcreteCreatorAClass" noOfClasses="1">
				<Class className="ConcreteCreatorA" isAbstract="No" isDerived="Yes" parentId="Creator"></Class>
			</SubGroup>
			<SubGroup groupID="ConcreteCreatorBClass" noOfClasses="1">
				<Class className="ConcreteCreatorB" isAbstract="No" isDerived="Yes" parentId="Creator"></Class>
			</SubGroup>
		</Classes>
		<Operations>
			<SubGroupOp groupID="CreatorOp" noOfOperations="1">
				<Function containingClassId="Creator" functionName="FactoryMethod" functionModifier="public" isAbstract="Yes" inputVariablesIds="" inputVariablesType="" returnType="Product"></Function>
			</SubGroupOp>
			<SubGroupOp groupID="cncCreatorAOp" noOfOperations="1">
				<Function containingClassId="ConcreteCreatorA" functionName="FactoryMethod" functionModifier="public" isOverRide="Yes" inputVariablesIds="" inputVariablesType="" returnType="Product"></Function>
			</SubGroupOp>
			<SubGroupOp groupID="cncCreatorBOp" noOfOperations="1">
				<Function containingClassId="ConcreteCreatorB" functionName="FactoryMethod" functionModifier="public" isOverRide="Yes" inputVariablesIds="" inputVariablesType="" returnType="Product"></Function>
			</SubGroupOp>
		</Operations>
		<Objects>
			<SubgroupOb groupID="ClientObjects">
				<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="cncProdAProdGn" noOfRelations="1">
				<Relation relationName="Generalization" initiatingClass="ConcreteProductA" endClass="Product"></Relation>
			</SubgroupR>
			<SubgroupR groupID="cncProdBProdGn" noOfRelations="1">
				<Relation relationName="Generalization" initiatingClass="ConcreteProductB" endClass="Product"></Relation>
			</SubgroupR>			
			<SubgroupR groupID="cncCrACrGn" noOfRelations="1">
				<Relation relationName="Generalization" initiatingClass="ConcreteCreatorA" endClass="Creator"></Relation>
			</SubgroupR>
			<SubgroupR groupID="cncCrBCrGn" noOfRelations="1">
				<Relation relationName="Generalization" initiatingClass="ConcreteCreatorB" endClass="Creator"></Relation>
			</SubgroupR>			
			<SubgroupR groupID="cncCrACrDy" noOfRelations="1">
				<Relation relationName="Dependency" initiatingClass="ConcreteCreatorA" endClass="ConcreteProductA"></Relation>
			</SubgroupR>
			<SubgroupR groupID="cncCrBCrDy" noOfRelations="1">
				<Relation relationName="Dependency" initiatingClass="ConcreteCreatorB" endClass="ConcreteProductB"></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="ConcreteCreatorA" CallingClass="MainApp" SetType="Class" ></SetObject>
		<SetObject ObjectId="creators.1" ObjectClass="Creator" SetTo="ConcreteCreatorB" CallingClass="MainApp" SetType="Class" ></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>
