Guest User

Untitled

a guest
Aug 18th, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.29 KB | None | 0 0
  1. main() {
  2. print(new Dog.with(breed: "Golden Retriever"));
  3. print(new Dog.with(breed: "Labrador Retriever"));
  4. print(new Dog.with(breed: "American Pit Bull Terrier"));
  5. print(new Dog.with(breed: "Australian Shepherd"));
  6.  
  7. // Ok, so try registering the type
  8. OpenMindedDogFactory.register(
  9. when: (breed) => breed == "American Pit Bull Terrier",
  10. thenReturn: () => new AmericanPitBullTerrier());
  11.  
  12. print("Ok, now we registered a new Dog type ... trying again");
  13.  
  14. print(new Dog.with(breed: "Golden Retriever"));
  15. print(new Dog.with(breed: "Labrador Retriever"));
  16. print(new Dog.with(breed: "American Pit Bull Terrier"));
  17. print(new Dog.with(breed: "Australian Shepherd"));
  18. }
  19.  
  20. interface Dog factory OpenMindedDogFactory {
  21. Dog.with([String breed]);
  22. }
  23.  
  24. // Simple interface factory.
  25. // Switches on something simple to determine the implementing class to use.
  26. class CloseMindedDogFactory {
  27. factory Dog.with([String breed = null]) {
  28. switch (breed) {
  29. case "Golden Retriever": return new GoldenRetriever();
  30. case "Labrador Retriever": return new LabradorRetriever();
  31. default: return new RegularDog();
  32. }
  33. }
  34. }
  35.  
  36. typedef bool DogChooser(String breed);
  37. typedef Dog DogFactory();
  38.  
  39. // Interface factory that stores a list of functions that can be registered so
  40. // they will be called whenever someone calls the interface's constructor.
  41. //
  42. // This allows other users to register their own callbacks with your interface
  43. // so they can return their own concrete types from your interface.
  44. class OpenMindedDogFactory {
  45. static List<DogChooser> _dogChoosers;
  46. static List<DogFactory> _dogFactories;
  47.  
  48. static void register([DogChooser when = null, DogFactory thenReturn = null]) {
  49. if (_dogChoosers == null) {
  50. _dogChoosers = new List<DogChooser>();
  51. _dogFactories = new List<DogFactory>();
  52. }
  53. _dogChoosers.add(when);
  54. _dogFactories.add(thenReturn);
  55. }
  56.  
  57. factory Dog.with([String breed = null]) {
  58. if (_dogChoosers != null) {
  59. for (int i = 0; i < _dogChoosers.length; i++) {
  60. if (_dogChoosers[i](breed))
  61. return _dogFactories[i]();
  62. }
  63. }
  64. return new RegularDog();
  65. }
  66. }
  67.  
  68. class RegularDog implements Dog {}
  69. class GoldenRetriever implements Dog {}
  70. class LabradorRetriever implements Dog {}
  71. class AmericanPitBullTerrier implements Dog {}
Add Comment
Please, Sign In to add comment