Posted by David Tucker in Cairngorm, FlexOct 7th, 2007
I spoke about Cairngorm 2.2 in the Flex Bootcamp at Max this week. Many people were interested in Cairngorm, but I only had about 10 minutes to explain the basics of Cairngorm. I guess the easiest way to assist these people is to do a quick blog series on the benefits of Cairngorm. This series will combine articles with “code-along” videos.
Disclaimer: I do not claim the be “the expert” on Cairngorm – I am far from it. However, I have used Cairngorm on several large projects (both at Georgia Tech and in my own business). I am certainly open to corrections if you see that I have made an error on this project. If you want “the experts” check out: Steven Webster, Alistair McLeod, Alex Uhlmann, and Peter Martin.
Note: The guys at Adobe Consulting (that developed Cairngorm) are currently investigating some new things with the framework as a whole. It is possible (actually probable) that some of these things will change in the future. One of the very specific areas of change is the Model Locator.
Part 1 – Getting Started By Using a Model Locator
The Model Locator pattern is used in Cairngorm, but you don’t have to have a full Cairngorm Implementation to use the pattern. First, let’s cover what benefits that you get from using a Model Locator.
A Model Locator is a centralized repository for all of the data that is needed across your application. Your data will exist inside of a “singleton class”. This “class” can only have one instance of itself. Why is this important? Let me give you an example.
We have great mini-notepads at work that I use to write down data while I work. However, sometimes, I lose a notepad – get a new one, and then find the old one. After both have been heavily used – it is really hard to find out which notepad I used to write down a piece of information from one week ago. That is a simple example – but imagine if I had 20 notepads? This could get crazy.
In the same way you could have a “class” that gets “instantiated” 20 times within your application (even if you don’t mean for it to). The easiest way to eliminate this problem is to use a “singleton”. A singleton is a class that is never “created” in the traditional way. It has one main rule – no more than one of itself can exist at any point in time. How does it do this? I will show you in the Model Locator example.
-
package net.davidtucker.CairngormSample.model {
-
import com.adobe.cairngorm.model.IModelLocator;
-
[Bindable]
-
public class ModelLocator implements IModelLocator {
-
// Single Instance of Our ModelLocator
-
private static var instance:ModelLocator;
-
public function ModelLocator(enforcer:SingletonEnforcer) {
-
if (enforcer == null) {
-
throw new Error( “You Can Only Have One ModelLocator” );
-
}
-
}
-
// Returns the Single Instance
-
public static function getInstance() : ModelLocator {
-
if (instance == null) {
-
instance = new ModelLocator( new SingletonEnforcer );
-
}
-
return instance;
-
}
-
//DEFINE YOUR VARIABLES HERE
-
}
-
}
-
// Utility Class to Deny Access to Constructor
-
class SingletonEnforcer {}
This code may look a bit daunting in the beginning, but trust me that it is not as difficult as it may appear. First, we have our package definition and we import some classes. Right now we know that we will need the IModelLocator interface. To use this you will need the Cairngorm SWC that can be found here: Cairngorm. Also note – you could build a model locator without Cairngorm, and I do this frequently on small projects (you just leave out the ‘implements IModelLocator’ and ‘import com.adobe.cairngorm.model.IModelLocator’ code from the Model Locator).
-
[Bindable]
-
public class ModelLocator implements IModelLocator {
-
// Single Instance of Our ModelLocator
-
private static var instance:ModelLocator;
Next we have our class definition. It is important that you use the Bindable metatag directly above your class definition. This will allow all of our variables that we define inside of the Model Locator to be used for binding. We also will go ahead and create one variable. It will be called “instance” and it will be of type ModelLocator. This will be the variable where we will store our one instance of our class. It will also be denoted as a “static” property. If you are not sure what a “static” property is, it’s ok – we will discuss that in our next lesson.
-
public function ModelLocator(enforcer:SingletonEnforcer) {
-
if (enforcer == null) {
-
throw new Error( “You Can Only Have One ModelLocator” );
-
}
-
}
This is followed by the constructor. The constructor takes on argument – “enforcer”. You will notice that this “enforcer” has a type of “SingletonEnforcer” which is defined directly after our class. Here is the logic behind that:
- When you put a class in an Actionscript file below the main class, it is only available to that class. Many people refer to these as “utility classes” (although many people use that term in a much broader scope).
- If the constructor requires this argument – then only our main class can create an instance of itself, because we do not have access to the “SingletonEnforcer” class – only the main class has this access.
- We will not access our class in the normal way by using the “new” statement because we can’t call the constructor (I will show you how we will do it in a bit).
Once we get inside of the constructor, we have a few lines that make sure things work as planned. The “if” statement ensures that we had a valid “enforcer” passed in. If there wasn’t it throws an Error stating that “You Can Have Only One ModelLocator”.
-
// Returns the Single Instance
-
public static function getInstance() : ModelLocator {
-
if (instance == null) {
-
instance = new ModelLocator( new SingletonEnforcer );
-
}
-
return instance;
-
}
The “getInstance” function is how we will access our ModelLocator from our application. This function simply passes back the “instance” of the class. If it doesn’t exist yet, it creates it. We can now get the ModelLocator by using the following code:
-
var model:ModelLocator = ModelLocator.getInstance();
Video Example – Getting Started and Building a Contact List
Application Code
Download (418 kB)

Recent Comments