Java设计模式——工厂模式

作者: 蓝桥云课 | 来源:发表于2017-09-26 17:18 被阅读258次

    说明:文章所有内容均截选自实验楼教程【Java设计模式】,想查看学习设计模式,查看教程完整内容的,点击即可进入页面进行学习哦~

    一、什么是设计模式

    在软件工程中,设计模式是对软件设计中普遍存在的各种问题,所提出的 解决方案

    换句话说,设计模式是一套被反复使用、多数人知晓的、经过分类的、代码设计的 经验的总结。使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码可靠性。

    二、设计模式原则

    1、开闭原则(Open Close Principle)

    开闭原则的意思是:对扩展开放,对修改封闭。在程序需要进行扩展的时候,不能去修改或影响原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性更好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类。

    2、里氏代换原则(Liskov Substitution Principle)

    里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。里氏代换原则是继承复用的基石,只有当子类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而且子类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

    3、依赖倒转原则(Dependence Inversion Principle)

    这个原则是开闭原则的基础,核心内容:针对接口编程,高层模块不应该依赖底层模块,二者都应该依赖抽象而不依赖于具体。

    4、接口隔离原则(Interface Segregation Principle)

    这个原则的意思是:使用多个隔离的接口,比使用单个庞大的接口要好。其目的在于降低耦合度。由此可见,其实设计模式就是从大型软件架构出发,便于升级和维护软件的设计思想。它强调低依赖、低耦合。

    5、单一职责原则(Single Responsibility Principle)

    类的职责要单一,不能将太多的职责放在一个类中。

    可能有的人会觉得单一职责原则和前面的接口隔离原则很相似,其实不然。其一,单一职责原则原注重的是职责;而接口隔离原则注重对接口依赖的隔离。其二,单一职责原则主要约束的是类,其次才是接口和方法,它针对的是程序中的实现和细节;而接口隔离原则主要约束接口,主要针对抽象,针对程序整体框架的构建。

    6、最少知道原则(Demeter Principle)

    最少知道原则也叫迪米特法则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。

    一个对象应该对其他对象保持最少的了解。类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。所以在类的设计上,每一个类都应当尽量降低成员的访问权限。

    7、合成复用原则(Composite Reuse Principle)

    合成复用原则就是在一个新的对象里通过关联关系(组合关系、聚合关系)来使用一些已有的对象,使之成为新对象的一部分;新对象通过委派调用已有对象的方法达到复用功能的目的。简而言之,尽量多使用 组合/聚合 的方式,尽量少使用甚至不使用继承关系。

    三、设计模式分类

    通常来说设计模式分为三大类:

    • 创建型模式,共5种:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式。

    • 结构型模式,共7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

    • 行为型模式,共11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

    下面用图片来整体描述一下设计模式之间的关系:

    图片描述信息

    四、Java设计模式 之 工厂模式

    1 什么是工厂模式

    工厂模式(Factory Pattern)的意义就跟它的名字一样,在面向对象程序设计中,工厂通常是一个用来创建其他对象的对象。工厂模式根据不同的参数来实现不同的分配方案和创建对象。

    在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。例如用工厂来创建 这个对象,如果我们需要一个男人对象,工厂就会为我们创建一个男人;如果我们需要一个女人,工厂就会为我们生产一个女人。

    工厂模式通常分为:

    • 普通工厂模式
    • 多个工厂方法模式
    • 静态工厂方法模式

    2 普通工厂模式

    刚刚我们说到,用工厂模式来创建人。先创建一个男人,他每天都 “吃饭、睡觉、打豆豆”,然后我们再创建一个女人,她每天也 “吃饭、睡觉、打豆豆”。

    我们以普通工厂模式为例。

    此处输入图片的描述

    示例代码如下(下面的代码块中是全部的代码,实际操作中应当按注释创建相应的类再将方法写入对应的类中):

    // 二者共同的接口
    public interface Human{
        public void eat();
        public void sleep();
        public void beat();
    }
    
    // 创建实现类 Male
    public class Male implements Human{
        public void eat(){
            System.out.println("Male can eat."); 
        }
        public void sleep(){
            System.out.println("Male can sleep.");
        }
        public void beat(){
            System.out.println("Male can beat.");
        }
    } 
    //创建实现类 Female
    public class Female implements Human{
        public void eat(){
            System.out.println("Female can eat."); 
        }
        public void sleep(){
            System.out.println("Female can sleep.");
        }
        public void beat(){
            System.out.println("Female can beat.");
        }
    } 
    
    // 创建普通工厂类
    public class HumanFactory{
        public Human createHuman(String gender){
            if( gender.equals("male") ){
               return new Male();
            }else if( gender.equals("female")){
               return new Female();
            }else {
                System.out.println("请输入正确的类型!");
                return null;
            }
        }
    }
    
    // 工厂测试类
    public class FactoryTest {
        public static void main(String[] args){
            HumanFactory factory = new HumanFactory();
            Human male = factory.createHuman("male");
            male.eat();
            male.sleep();
            male.beat();
        }
    }
    
    

    运行结果:

    此处输入图片的描述

    3 多个工厂方法模式

    普通工厂模式就是上面那样子了,那么多个工厂方法模式又有什么不同呢?在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象。多个工厂方法模式是提供多个工厂方法,分别创建对象。

    部分示例代码,其他与上面普通工厂模式示例代码一样:

    // 多个工厂方法
    public class HumanFactory{
        public Male createMale() {
            return new Male();
        }
        public Female createFemale() {
            return new Female();
        }
    }
    
    // 工厂测试类
    public class FactoryTest {
        public static void main(String[] args){
            HumanFactory factory = new HumanFactory();
            Human male = factory.createMale();
            male.eat();
            male.sleep();
            male.beat();
        }
    }
    
    

    运行结果与普通工厂模式的示例一样。

    4 静态工厂方法模式

    将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。

    部分示例代码:

    // 多个工厂方法
    public class HumanFactory{
        public static Male createMale() {
            return new Male();
        }
        public static Female createFemale() {
            return new Female();
        }
    }
    
    // 工厂测试类
    public class FactoryTest {
        public static void main(String[] args){
            Human male = HumanFactory.createMale();
            male.eat();
            male.sleep();
            male.beat();
        }
    }
    

    总结:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。

    5 工厂模式应用

    你可能就问了,工厂模式工厂模式的,我咋没见过哪儿用过啊?这这这儿,在 Java 库里面。根据不同的参数,getInstance() 方法会返回不同的 Calendar 对象。

    java.util.Calendar - getInstance()
    java.util.Calendar - getInstance(TimeZone zone)
    java.util.Calendar - getInstance(Locale aLocale)
    java.util.Calendar - getInstance(TimeZone zone, Locale aLocale)
    java.text.NumberFormat - getInstance()
    java.text.NumberFormat - getInstance(Locale inLocale)
    

    写 Android 的童鞋们,应该还知道 BitmapFactory , 这也是工厂模式的一种应用。

    最后:

    文章所有内容均截选自实验楼教程【Java设计模式】,该教程总共7节,教程列表如下:

    • 设计模式简介
    • 工厂模式
    • 抽象工厂模式
    • 适配器模式
    • 装饰者模式
    • 观察者模式
    • 单例模式

    点击教程【Java设计模式】即可学习以上内容了;

    相关文章

      网友评论

      • 知识学者:实验楼11级了😂,上次遇到40级大佬

      本文标题:Java设计模式——工厂模式

      本文链接:https://www.haomeiwen.com/subject/etwsextx.html