1. In my application I have a module : CommunicationMgmtSystem
2. CommunicationMgmtSystem (Package) has two submodules : MailMgmtSystem(package) and MobileMgmtSystem(package)
3. other modules call CommunicationMgmtSystem for sending automated mails or SMS, CommunicationMgmtSystem delegates the task of sending mails or SMS to respective submodule MailMgmtSystem or MobileMgmtSystem
I dont want other modules except CommunicationMgmtSystem to be able to access MailMgmtSystem/MobileMgmtSystem 's classes?
To answer this question. Your description is about the open closed principle.
Most applicable patterns are template method or strategy pattern.
You can differ between these two based on the answering the following question :
* Are you redefining a step of an algorithm without changing the algorithms structure. A positive answer on this will result in the template method.
* Are you redefining the structure of the algorithm used. A positive answer on this will result in the strategy pattern.
My purpose is to modify the abstract factory pattern
You can get products from the factory by passing the relevant parameter. But i does not restrict any other class from accessing the product directly using new operator. How do we apply "Constraints" in abstract factory. I dont want to use reflection because it is expensive.
Their achilles heel is the noogie! Give them noogies tiny ad!