• 每天一个设计模式(4):简单工厂“模式”


    4.简单工厂“模式”

    一.简单工厂介绍

    1.1 简单工厂定义

      简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。实际上简单工厂并不是一种设计模式,反而比较像一种编程习惯,可以将客户程序从具体类解耦。

    1.2 适用场景

      简单工厂实例化的类具有相同的接口或者基类,在子类比较固定并不需要扩展时,可以使用简单工厂。如数据库生产工厂就是简单工厂的一个应用。

      简单工厂需要知道所有要生成的类型,当子类过多或者子类层次过多时不适合使用。

    1.3 优缺点

      采用简单工厂的优点是可以使用户根据参数获得对应的类实例,避免了直接实例化类,降低了耦合性

      缺点是可实例化的类型在编译期间已经被确定,如果增加新类型,则需要修改工厂,不符合OCP(开闭原则)的原则。

    二.UML关系图

    由上图我们可以看到简单工厂模式由三部分组成:

    • 简单工厂角色(Creator):这是简单工厂模式的核心,由它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。
    • 抽象产品角色(Product):简单工厂模式所创建的所有对象的父类,注意,这里的父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口。
    • 具体产品角色(Concrete Product):简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。

    三.简单工厂例子

    本人认为下面这个女娲造人的例子是说明简单工厂“模式”最经典的例子,通过该例子可以清晰的认识到简单工厂。

    3.1 女娲造人

    话说:“天地开辟,未有人民,女娲抟土为人。”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面。

    首先,在这个造人的思想里面,有几个重要的角色:女娲本身、抽象的人的概念和女娲所造出的一个个具体的人。

    1. 女娲是一个工厂类,也就是简单工厂模式的核心角色。
    2. 抽象的人是最早只存在于女娲的头脑里的一个想法,女娲按照这个想法造出的一个个具体的人,便都符合这个抽象的人的定义。换言之,这个抽象的想法规定了所有具体的人必须都有的接口(特征或者功能)。
    3. 具休的一个个的人,包括张三,李四等。这些人便是简单工厂模式里面的具体产品角色

     其UML类图出下所示:

    其中女娲对应的就是简单工厂角色,女娲脑里的想法对应的就是抽象产品角色,创造出出来的具休的人对应的就是具体产品角色。

    示例代码:

     1 //定义女娲脑里对人的抽象概念的接口
     2 interface People{
     3     public void eat();
     4     public void sleep();
     5     public void talk();
     6 }
     7 
     8 //创造具体人类的具体实现类
     9 class Zhangsan implements People{
    10     public void eat(){
    11         System.out.println("Zhangsan can eat。。。。。");
    12     }
    13     public void sleep(){
    14         System.out.println("Zhangsan can sleep。。。。。");
    15     }
    16     public void talk(){
    17         System.out.println("Zhangsan can talk。。。。。");
    18     }
    19 }
    20 
    21 class Lisi implements People{
    22     public void eat(){
    23         System.out.println("Lisi can eat。。。。。");
    24     }
    25     public void sleep(){
    26         System.out.println("Lisi can sleep。。。。。");
    27     }
    28     public void talk(){
    29         System.out.println("Lisi can talk。。。。。");
    30     }
    31 }
    32 
    33 //女娲简单工厂
    34 class Nvwa{
    35     public static People getPeopleInstance(String type){
    36         People p=null;
    37         if("Zhangsan".equals(type)){
    38             p=new Zhangsan();
    39         }
    40         if("Lisi".equals(type)){
    41             p=new Lisi();
    42         }
    43         return p;
    44     }
    45 }
    46 
    47 public class FactoryDemo {
    48     public static void main(String[] args) {
    49         People p=Nvwa.getPeopleInstance("Zhangsan");
    50         if(p!=null){
    51             p.eat();
    52             p.sleep();
    53             p.talk();
    54         }else{
    55             System.out.println("造不了这种人。。。");
    56         }
    57     }
    58 }

    3.2 生产披萨

    UML类图:

    示例代码:

     1 简单工厂实现披萨店
     2 
     3 public class SimplePizzaFactory
     4 {
     5     public Pizza createPizza(String type)
     6     {
     7         Pizza pizza = null;        
     8         if(type.equals("cheese"))
     9         {
    10             pizza = new CheesePizza();
    11         }
    12         else if(type.equals("greel"))
    13         {
    14             pizza = new GreekPizza();
    15         }
    16         else if(type.equals("pepperoni"))
    17         {
    18             pizza = new PepperoniPizza();
    19         }
    20         return pizza;
    21     }
    22 }
    23 public class PizzaStore
    24 {
    25     SimplePizzaFactory factory;
    26 
    27     public PizzaStore(SimplePizzaFactory factory)
    28     {
    29         this.factory = factory;
    30     }
    31     public Pizza orderPizza(String type)
    32     {
    33         Pizza pizza;
    34         pizza = factory.createPizza(type);
    35         pizza.prepare();
    36         pizza.bake();
    37         pizza.cut();
    38         pizza.box();
    39         return pizza;
    40     }
    41 }

    四.总结

    总结一下:简单工厂模式分离产品的创建者和消费者,有利于软件系统结构的优化;但是由于一切逻辑都集中在一个工厂类中,导致了没有很高的内聚性,同时也违背了“开放封闭原则”。另外,简单工厂模式的方法一般都是静态的,而静态工厂方法是无法让子类继承的,因此,简单工厂模式无法形成基于基类的继承树结构。

    参考:《Head First设计模式》

    http://blog.csdn.net/weiwenlongll/article/details/6918164

    http://www.blogjava.net/jzgl-ever/archive/2008/07/26/217704.html

  • 相关阅读:
    Spring boot 基于注解方式配置datasource
    Java任务调度框架之分布式调度框架XXL-Job介绍
    mysql使用联合索引提示字符长度超限制解决办法
    程序访问一个地址时候报400错误,浏览器访问正常怎么解决
    JDK8stream将list转Map对象报错java.lang.IllegalStateException
    如何应对互联网行业的「中年危机」?
    SpringMVC访问出错No converter found for return value of type
    怎么设置tomcat在get请求的中文也不乱码?两种情况下配置
    使用tomcat方式实现websocket即时通讯服务端讲解
    服务端向客户端推送消息技术之websocket的介绍
  • 原文地址:https://www.cnblogs.com/Eason-S/p/5681488.html
Copyright © 2020-2023  润新知