Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- main() {
- print(new Dog.with(breed: "Golden Retriever"));
- print(new Dog.with(breed: "Labrador Retriever"));
- print(new Dog.with(breed: "American Pit Bull Terrier"));
- print(new Dog.with(breed: "Australian Shepherd"));
- // Ok, so try registering the type
- OpenMindedDogFactory.register(
- when: (breed) => breed == "American Pit Bull Terrier",
- thenReturn: () => new AmericanPitBullTerrier());
- print("Ok, now we registered a new Dog type ... trying again");
- print(new Dog.with(breed: "Golden Retriever"));
- print(new Dog.with(breed: "Labrador Retriever"));
- print(new Dog.with(breed: "American Pit Bull Terrier"));
- print(new Dog.with(breed: "Australian Shepherd"));
- }
- interface Dog factory OpenMindedDogFactory {
- Dog.with([String breed]);
- }
- // Simple interface factory.
- // Switches on something simple to determine the implementing class to use.
- class CloseMindedDogFactory {
- factory Dog.with([String breed = null]) {
- switch (breed) {
- case "Golden Retriever": return new GoldenRetriever();
- case "Labrador Retriever": return new LabradorRetriever();
- default: return new RegularDog();
- }
- }
- }
- typedef bool DogChooser(String breed);
- typedef Dog DogFactory();
- // Interface factory that stores a list of functions that can be registered so
- // they will be called whenever someone calls the interface's constructor.
- //
- // This allows other users to register their own callbacks with your interface
- // so they can return their own concrete types from your interface.
- class OpenMindedDogFactory {
- static List<DogChooser> _dogChoosers;
- static List<DogFactory> _dogFactories;
- static void register([DogChooser when = null, DogFactory thenReturn = null]) {
- if (_dogChoosers == null) {
- _dogChoosers = new List<DogChooser>();
- _dogFactories = new List<DogFactory>();
- }
- _dogChoosers.add(when);
- _dogFactories.add(thenReturn);
- }
- factory Dog.with([String breed = null]) {
- if (_dogChoosers != null) {
- for (int i = 0; i < _dogChoosers.length; i++) {
- if (_dogChoosers[i](breed))
- return _dogFactories[i]();
- }
- }
- return new RegularDog();
- }
- }
- class RegularDog implements Dog {}
- class GoldenRetriever implements Dog {}
- class LabradorRetriever implements Dog {}
- class AmericanPitBullTerrier implements Dog {}
Add Comment
Please, Sign In to add comment