设计模式学习(1)简单工厂模式:君子远庖厨

原文链接:http://www.cnblogs.com/feixian49/archive/2008/04/09/1145212.html

一、题引

 在《孟子·梁惠王上》有如此一句话:"君子之于禽兽也,见其生,不忍见其死;闻其声,不忍食其肉。是以君子远庖厨也。"翻译过来意思是:"君子对于飞禽走兽,见到它们活着,便不忍心见到它们死去;听到它们哀叫,便不忍心吃它们的肉。所以,君子总是远离厨房(远离杀生)。"孟子的意思是说:道德高尚的人(君子)不忍心杀生,而现代的某些男人为了偷懒不下厨做饭,则借口说"古代圣贤孟子就教导我们君子总是远离厨房的"。

 二、例子

既然男人不下厨,那就只有女人来了。
"亲爱的,我饿了,快做饭。"
"亲爱的,我要吃鱼。"
"亲爱的,我要喝汤。"

于是有以下的类:

 

设计模式学习(1)简单工厂模式:君子远庖厨饭() 
设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨    …… 
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨鱼() 
设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨    …… 
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨汤() 
设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨    …… 
设计模式学习(1)简单工厂模式:君子远庖厨}  
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨女人() 
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨{     
设计模式学习(1)简单工厂模式:君子远庖厨    下厨(食物名) 
设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨    设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨        if(食物名="饭") 
设计模式学习(1)简单工厂模式:君子远庖厨            食物 = new 饭() 
设计模式学习(1)简单工厂模式:君子远庖厨        else if(食物名="鱼") 
设计模式学习(1)简单工厂模式:君子远庖厨            食物 = new 鱼() 
设计模式学习(1)简单工厂模式:君子远庖厨        else if(食物名="汤") 
设计模式学习(1)简单工厂模式:君子远庖厨            食物 = new 汤()     
设计模式学习(1)简单工厂模式:君子远庖厨        return 食物 
设计模式学习(1)简单工厂模式:君子远庖厨    } 
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨     休息()设计模式学习(1)简单工厂模式:君子远庖厨{} 
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨 幸福家庭() 
设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨    老婆 = new 女人(); 
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨     过日子()设计模式学习(1)简单工厂模式:君子远庖厨{     
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨        //老公.看电视() 
设计模式学习(1)简单工厂模式:君子远庖厨        食物 = 老婆.下厨("饭") 
设计模式学习(1)简单工厂模式:君子远庖厨        //老公.吃(食物) 
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨 
设计模式学习(1)简单工厂模式:君子远庖厨        //老公.上网() 
设计模式学习(1)简单工厂模式:君子远庖厨        食物 = 老婆.下厨("鱼") 
设计模式学习(1)简单工厂模式:君子远庖厨        //老公.吃(食物) 
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨 
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨        //老公.看报纸() 
设计模式学习(1)简单工厂模式:君子远庖厨        食物 = 老婆.下厨("汤") 
设计模式学习(1)简单工厂模式:君子远庖厨        //老公.吃(食物) 
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨    } 
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨 } 
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨

 
 UML 图如下:

 设计模式学习(1)简单工厂模式:君子远庖厨

 参看代码:

 

 

设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨Code
设计模式学习(1)简单工厂模式:君子远庖厨using System;
设计模式学习(1)简单工厂模式:君子远庖厨using System.Collections.Generic;
设计模式学习(1)简单工厂模式:君子远庖厨using System.Text;
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨namespace SimpleFactoryWifeCook
设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨{
设计模式学习(1)简单工厂模式:君子远庖厨    //食物 接口 Abstract Product
设计模式学习(1)简单工厂模式:君子远庖厨    public interface Food
设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨    设计模式学习(1)简单工厂模式:君子远庖厨{
设计模式学习(1)简单工厂模式:君子远庖厨        String ShowName();
设计模式学习(1)简单工厂模式:君子远庖厨    }
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨    //米饭类 Concrete Product
设计模式学习(1)简单工厂模式:君子远庖厨    public class Rice : Food
设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨    设计模式学习(1)简单工厂模式:君子远庖厨{
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨        public Rice()
设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨        设计模式学习(1)简单工厂模式:君子远庖厨{
设计模式学习(1)简单工厂模式:君子远庖厨            System.Console.WriteLine("Rice is Ready!");
设计模式学习(1)简单工厂模式:君子远庖厨        }
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨        public string ShowName()
设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨        设计模式学习(1)简单工厂模式:君子远庖厨{
设计模式学习(1)简单工厂模式:君子远庖厨            return "Rice";
设计模式学习(1)简单工厂模式:君子远庖厨        }
设计模式学习(1)简单工厂模式:君子远庖厨    }
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨    //鱼类 Concrete Product
设计模式学习(1)简单工厂模式:君子远庖厨    public class Fish : Food
设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨    设计模式学习(1)简单工厂模式:君子远庖厨{
设计模式学习(1)简单工厂模式:君子远庖厨        public Fish()
设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨        设计模式学习(1)简单工厂模式:君子远庖厨{
设计模式学习(1)简单工厂模式:君子远庖厨            System.Console.WriteLine("Fish is Ready!");
设计模式学习(1)简单工厂模式:君子远庖厨        }
设计模式学习(1)简单工厂模式:君子远庖厨        public String ShowName()
设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨        设计模式学习(1)简单工厂模式:君子远庖厨{
设计模式学习(1)简单工厂模式:君子远庖厨            return "Fish";
设计模式学习(1)简单工厂模式:君子远庖厨        }
设计模式学习(1)简单工厂模式:君子远庖厨    }
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨    //汤类 Concrete Product
设计模式学习(1)简单工厂模式:君子远庖厨    public class Soup : Food
设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨    设计模式学习(1)简单工厂模式:君子远庖厨{
设计模式学习(1)简单工厂模式:君子远庖厨        public Soup()
设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨        设计模式学习(1)简单工厂模式:君子远庖厨{
设计模式学习(1)简单工厂模式:君子远庖厨            System.Console.WriteLine("Soup is Ready!");
设计模式学习(1)简单工厂模式:君子远庖厨        }
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨        public String ShowName()
设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨        设计模式学习(1)简单工厂模式:君子远庖厨{
设计模式学习(1)简单工厂模式:君子远庖厨            return "Soup";
设计模式学习(1)简单工厂模式:君子远庖厨        }
设计模式学习(1)简单工厂模式:君子远庖厨    }
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨    //女人类 Creactor
设计模式学习(1)简单工厂模式:君子远庖厨    public class Woman
设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨    设计模式学习(1)简单工厂模式:君子远庖厨{
设计模式学习(1)简单工厂模式:君子远庖厨        // 下厨 Factory Method
设计模式学习(1)简单工厂模式:君子远庖厨        public Food Cook(String sFood)
设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨        设计模式学习(1)简单工厂模式:君子远庖厨{
设计模式学习(1)简单工厂模式:君子远庖厨            Food f = null;
设计模式学习(1)简单工厂模式:君子远庖厨            if (sFood == "Rice")
设计模式学习(1)简单工厂模式:君子远庖厨                f = new Rice();
设计模式学习(1)简单工厂模式:君子远庖厨            else if (sFood == "Fish")
设计模式学习(1)简单工厂模式:君子远庖厨                f = new Fish();
设计模式学习(1)简单工厂模式:君子远庖厨            else if (sFood == "Soup")
设计模式学习(1)简单工厂模式:君子远庖厨                f = new Soup();
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨            return f;
设计模式学习(1)简单工厂模式:君子远庖厨        }
设计模式学习(1)简单工厂模式:君子远庖厨    }
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨    //男人 Client
设计模式学习(1)简单工厂模式:君子远庖厨    class Man
设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨    设计模式学习(1)简单工厂模式:君子远庖厨{
设计模式学习(1)简单工厂模式:君子远庖厨        static void Main(string[] args)
设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨        设计模式学习(1)简单工厂模式:君子远庖厨{
设计模式学习(1)简单工厂模式:君子远庖厨            Woman wife = new Woman();
设计模式学习(1)简单工厂模式:君子远庖厨            Food aFood;
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨            aFood = wife.Cook("Rice");
设计模式学习(1)简单工厂模式:君子远庖厨            Man.Eat(aFood);
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨            aFood = wife.Cook("Fish");
设计模式学习(1)简单工厂模式:君子远庖厨            Man.Eat(aFood);
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨            aFood = wife.Cook("Soup");
设计模式学习(1)简单工厂模式:君子远庖厨            Man.Eat(aFood);
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨            System.Console.ReadLine();
设计模式学习(1)简单工厂模式:君子远庖厨        }
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨        static void Eat(Food aFood)
设计模式学习(1)简单工厂模式:君子远庖厨设计模式学习(1)简单工厂模式:君子远庖厨        设计模式学习(1)简单工厂模式:君子远庖厨{
设计模式学习(1)简单工厂模式:君子远庖厨            System.Console.WriteLine("Yeah! I am eating " + aFood.ShowName());
设计模式学习(1)简单工厂模式:君子远庖厨        }
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨    }
设计模式学习(1)简单工厂模式:君子远庖厨
设计模式学习(1)简单工厂模式:君子远庖厨}

 

这里Woman类的Cook方法是一个工厂方法,它根据参数"食物名"来判断要制造什么食物,以供消费(使用)。Man 类不知道有 Rice、Fish、Soup 等具体产品类(Concrete Product)的存在,它只依赖 Food 接口(Abstract Product)和 Woman (Factory),不管 Woman Cook 什么Food出来,Man 用它的 Eat 方法来吃东西即可,不管是 Rice、Fish、还是Soup或者其它可吃的东西。

 

三、总结:  

简单工厂模式的一般 UML 结构图

设计模式学习(1)简单工厂模式:君子远庖厨

角色

抽象产品角色(Abstract Product):负责生产具体加工的对象,而作为抽象对象返回,让客户可以以统一的接口处理不同的具体产品类。

具体产品角色(Concrete Product):定义抽象的加工对象,给具体的加工对象提供一个统一的接口,可以是接口、抽象类、类等。

工厂类(Factory/Creator): 定义具体加工的对象。

 

工厂方法模式的设计思想是:将非核心的业务分离出去给另一个类来处理。这个非核心的业务就是生成具有一定相似性的不同类,它们继承自一个接口(抽象类或类),让一个专门的工厂类来负责生产这些不同的类,如同一个专门的工厂制造各样的产品,而客户类只管消费。工厂不必事先知道要生成什么样的类,可以动态决定制造什么产品。

 

优缺点

优点:

客户类不必知道形形色色的具体产品类,它只关联工厂类抽象产品类,以抽象产品类的统一接口(多态)来处理各种具体类,简化了客户类的操作。客户类负责自己的逻辑,工厂类负责创建具体产品类,做到了责任的分割。

缺点:

1、扩展困难,没有完全遵循"开闭原则",没有完全达到"对扩展开放,对修改关闭",当有新的具体类添加进来时,要修改工厂方法的判断逻辑。

2、当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变,就是模式的缺点。因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。

3、简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。

下载附件:
SimpleFactoryWifeCook

转载于:https://www.cnblogs.com/feixian49/archive/2008/04/09/1145212.html

上一篇:uniapp本地资源打包app或运行到模拟器


下一篇:惊呆了!一个程序员的水平能差到什么程度?