• JAVA设计模式之2-简单工厂模式


    今天来介绍简单工厂模式,工厂模式包括简单工厂模式和抽象工厂模式,今天先讲简单工厂模式,然后引申到抽象工厂模式

    在没有工厂模式前,我们创建类是直接new一个对象,比如下面所示,北汽有两个小型SUV,分别是绅宝x25和绅宝x55,现在4s店要分别要一辆,然后就可以用下面的来新建对象

     1 public class ShenbaoX25 {
     2     public ShenbaoX25() {
     3         System.out.println("This is 绅宝X25");
     4     }
     5 }
     6 
     7 public class ShenbaoX55 {
     8     public ShenbaoX55() {
     9         System.out.println("This is 绅宝x55");
    10     }
    11 }
    12 
    13 public class Customer{
    14     public static void main(String[] args){
    15         ShenbaoX25 sbx25 = new ShenbaoX25();
    16         ShenbaoX55 sbx55 = new ShenbaoX55();
    17     }
    18 }
    传统新建对象

    这样对象和消费者的耦合度高了,因为这两个对象绑定到一块了。在现实生活中,我们的汽车都是工厂里生产的,所以,联系实际,我们要用工厂模式试试。这里就是简单工厂模式,要点在哪里?

    根据前篇文章,我们从WWH(WHAT?WHY?HOW)来开启学习步骤

    1,WHAT?

    什么是简单工厂模式,百度给的解释如下

    简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

    简单的说就是,一个工厂可以生产很多产品,最后我们可以根据子类来设定生成的对象的类型,这就是简单工厂模式。

    我的天哪,这个类不就是万能的上帝类了啊,我要个猪,就给猪,要个恐龙,就给个恐龙?实际上这样的类很少,或者说这个类比较专一,比如说这个类是计算器类,计算器类里面的子类完全可以枚举出来的,像加减乘除开方乘方阶乘的,所以我们完全可以将这个类细化为万能的计算器上帝类。这是后话。

    2,WHY?

    为什么要用这个模式呢?

    想想以前,我们创建对象就是通过一个一个new的类,如果这些类的对象比较类似,比如说像上面的北汽汽车,这些车都有一些共同的属性或者方法,所以,我们可以采用将要求给工厂,工厂帮我们造,对吧,这就是存在价值,将我们解脱于不停的创建类似的类中去。

    3,HOW?

    怎么使用这个模式呢?

    定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。

    /***********************************************************/
    //抽象类
    abstract class Shenbao{
        public abstract void RunInSpeed() ;
    }
    //实例化绅宝x25系列
    public class ShenbaoX25 extends Shenbao {
        @Override
        public void RunInSpeed() {
            // TODO Auto-generated method stub
        }
    }
    //实例化绅宝x55系列
    public class ShenbaoX55 extends Shenbao {
        @Override
        public void RunInSpeed() {
            // TODO Auto-generated method stub    
        }
    }
    /***********************************************************/
    //工厂类
    interface BeiqiFactory{
        Shenbao createShenbao();
    }
    //实现绅宝x25的创建
    public class FactorySBX25 implements BeiqiFactory{
        public ShenbaoX25 createSBX25() {
            return new ShenbaoX25();
        }
    }
    /***********************************************************/
    //新建方法
    public class Custom{
        public static void GetSBX25(){
            FactorySBX25 sbx25 = new FactorySBX25();
            ShenbaoX25 x25 = sbx25.createSBX25();
        }
    }
    /***********************************************************/
    简单工厂模式

    如上所示:步骤:

    1. 定义一个创建对象的接口
    2. 子类实现这个接口,然后有子类来决定实例化哪一个类

    4,存在的问题

    正如上面所说,如果类是种类是可以枚举的,比如说计算器的操作,加减乘除等,这可以使用简单工厂模式,但是如果类很多分支呢,比如说上面的这个汽车的例子,绅宝系列有绅宝x25,x35,x55,x65等,每个系列有MT和AT,每个MT有舒适版,精英版,豪华版等等,如果按照简单工厂模式生成的,那每一个系列都得有很多类,这样造成类的冗余。

    造成这个原因是什么呢,就是耦合度太高了,是对象和类死死的绑定在一起,根据我们的观察啊,绅宝系列的轮子是一样的,中控也差不多,我们设想一下,有没有这种可能,就是说我们可不可以有一个抽象的工厂,这个工厂可以拿不同的产品来组合在一起,形成不同的对象?

    答案是肯定的,这就是下面我要介绍的抽象工厂模式

    注解

    灵感来自:

    1,http://blog.csdn.net/hguisu/article/details/7505909

    2,大话设计模式(这本书挺好的,我只看了一部分,对计算器这个记得很清楚,所以上面就用了计算器的例子了,抽象工厂好像用的是超市收银系统,这个我用的是灵感1中的造车案例,原因是最近看了车,然后根据车的配置来细化这个问题,有什么不正之处敬请指正。)

  • 相关阅读:
    索引失效
    laravel记录笔记Laravel 连接数据库、操作数据库的三种方式
    php 基于redis计数器类
    0x02 MySQL SQL基本语句
    0x01 MySQL What's DataBase
    浅析僵尸进程&孤儿进程
    python并发编程&IO模型
    关于python代码是编译执行还是解释执行
    python并发编程&协程
    基于Cpython的 GIL(Global Interpreter Lock)
  • 原文地址:https://www.cnblogs.com/ningheshutong/p/6026754.html
Copyright © 2020-2023  润新知