淘先锋技术网

首页 1 2 3 4 5 6 7
        在园子里看了些设计模式的文章。平常只是看看,长了很多见识,但学习毕竟要动手,才会运用自如。刚好项目中要增加一些功能, Leader 叫我自己来实现这个功能,那我就来试试。 举例来说明我做的功能吧。

        假设如果我们要出国,当然要先递交申请给出国办事处,然后由中国办事处再转交给你想去的国家的大使馆,让他们审核你的信息。如果用工厂模式可以这么做。

 

 

 1 None.gif   public   abstract   class  Office
 2 ExpandedBlockStart.gifContractedBlock.gif     dot.gif {
 3InBlock.gif        public abstract void CheckInfo();
 4ExpandedBlockEnd.gif    }

 5 None.gif
 6 None.gif     public   class  USAoffice : Office
 7 ExpandedBlockStart.gifContractedBlock.gif     dot.gif {
 8InBlock.gif        public override void CheckInfo()
 9ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{ Console.WriteLine("This ia USAoffice CheckInfo"); }
10ExpandedBlockEnd.gif    }

11 None.gif
12 None.gif     public   class  UKoffice : Office
13 ExpandedBlockStart.gifContractedBlock.gif     dot.gif {
14InBlock.gif        public override void CheckInfo()
15ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{ Console.WriteLine("This ia UKoffice CheckInfo"); }
16InBlock.gif
17ExpandedBlockEnd.gif    }

18 None.gif
19 None.gif     public   abstract   class  Creator
20 ExpandedBlockStart.gifContractedBlock.gif     dot.gif {
21InBlock.gif        public abstract Office factory();
22ExpandedBlockEnd.gif    }

23 None.gif
24 None.gif     public   class  USAcreator : Creator
25 ExpandedBlockStart.gifContractedBlock.gif     dot.gif {
26InBlock.gif        public override Office factory()
27ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gifreturn new USAoffice(); }
28ExpandedBlockEnd.gif    }

29 None.gif
30 None.gif     public   class  UKCreator : Creator
31 ExpandedBlockStart.gifContractedBlock.gif     dot.gif {
32InBlock.gif        public override Office factory()
33ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gifreturn new UKoffice(); }
34ExpandedBlockEnd.gif    }

35 None.gif
36 None.gif     public   class  Client
37 ExpandedBlockStart.gifContractedBlock.gif     dot.gif {
38InBlock.gif        public static void Main()
39ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
40InBlock.gif            Creator c1 = new USAcreator();
41InBlock.gif            Creator c2 = new UKCreator();
42InBlock.gif
43InBlock.gif            Office l1 = c1.factory();
44InBlock.gif            Office l2 = c2.factory();
45InBlock.gif
46InBlock.gif            l1.CheckInfo();
47InBlock.gif
48InBlock.gif            Console.WriteLine("-----------------");
49InBlock.gif
50InBlock.gif            l2.CheckInfo();
51ExpandedSubBlockEnd.gif        }

52ExpandedBlockEnd.gif    }

 

这是我参考吕老师的工厂模式的设计,他的文章写得很好,但这个设计并不能满足我的需求,因为这个模式在Client需要手动实例一个对象,如在Client端Creator c1 = new USAcreator();。所以我自己改良一下。

 


 1 None.gif
 2 None.gif     public   abstract   class  Office
 3 ExpandedBlockStart.gifContractedBlock.gif     dot.gif {
 4InBlock.gif        public abstract void CheckInfo();
 5ExpandedBlockEnd.gif    }

 6 None.gif
 7 None.gif     public   class  USAoffice : Office
 8 ExpandedBlockStart.gifContractedBlock.gif     dot.gif {
 9InBlock.gif        public override void CheckInfo()
10ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{ Console.WriteLine("This ia USAoffice CheckInfo"); }
11ExpandedBlockEnd.gif    }

12 None.gif
13 None.gif     public   class  UKoffice : Office
14 ExpandedBlockStart.gifContractedBlock.gif     dot.gif {
15InBlock.gif        public override void CheckInfo()
16ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{ Console.WriteLine("This ia UKoffice CheckInfo"); }
17InBlock.gif
18ExpandedBlockEnd.gif    }

19 None.gif     public   class  Creator
20 ExpandedBlockStart.gifContractedBlock.gif     dot.gif {
21InBlock.gif        public static Office Factory(string OfficeName)
22ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
23InBlock.gif            if (OfficeName == "USA")
24ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
25InBlock.gif                return new USAoffice();
26ExpandedSubBlockEnd.gif            }

27InBlock.gif            if (OfficeName == "UK")
28ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
29InBlock.gif                return new UKoffice();
30ExpandedSubBlockEnd.gif            }

31ExpandedSubBlockEnd.gif        }

32ExpandedBlockEnd.gif    }

33 None.gif     public   class  Client
34 ExpandedBlockStart.gifContractedBlock.gif     dot.gif {
35InBlock.gif        public static void Main()
36ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
37InBlock.gif            string OfficeName = Console.ReadLine();
38InBlock.gif            Office ConcreteOffice= Creator.Factory(OfficeName);
39InBlock.gif
40InBlock.gif            ConcreteOffice.CheckInfo();
41InBlock.gif
42ExpandedSubBlockEnd.gif        }

43ExpandedBlockEnd.gif    }


这个好处就在factory通过传递参数能自动判断该创建哪个实例,Client取到OfficeName就可以自动判断并创建所需要的实例。当然一眼也可以看出这个设计的致命点,就是如果以后Office越来越多,Creator的factory函数将会臃肿,不过目前这个设计足以满足我的需求啊。
        第一次设计,虽然不好,但也能完成任务,以后发现问题再重构,一口并不能吃成胖子。

转载于:https://www.cnblogs.com/Liuchfa/archive/2007/01/29/633034.html