设计模式----工厂模式

本文深入探讨了设计模式中的工厂模式,这是一种常用的创建型模式,用于封装对象的创建过程。通过工厂模式,我们可以将对象的实例化延迟到子类中,遵循开闭原则。文中介绍了设计模式的基本概念、六大原则以及工厂模式的工作原理,包括接口隔离、依赖倒转等原则的应用。此外,还展示了如何在Java中实现工厂模式,包括接口、实体类和工厂类的定义及使用。

设计模式----工厂模式

​ 今天突然心血来潮想研究一下设计模式中,用的最多的,也是最常用的设计模式之一“工厂模式”。好了,废话不多说,正片现在正式开始。

​ 首先我们先了解一下什么是设计模式。设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

设计模式的类型

根据设计模式的参考书 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 中所提到的,总共有 23 种设计模式。这些模式可以分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns)。

设计模式的六大原则

1、开闭原则(Open Close Principle)

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

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

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

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

这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。

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

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

5、迪米特法则,又称最少知道原则(Demeter Principle)

最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。

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

合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。

工厂模式

​ 首先我们要知道工厂模式它是一种创建型模式,它提供了最佳创建方式。在工厂模式中创建对象时不会对客户端暴露创建逻辑,并且是通过一个指定的公共接口来创建对象。

**意图:**定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

**主要解决:**主要解决接口选择的问题。

**何时使用:**我们明确地计划不同条件下创建不同实例时。

**如何解决:**让其子类实现工厂接口,返回的也是一个抽象的产品。

**关键代码:**创建过程在其子类执行。

首先我们先创建一个公共接口“Shape”:

public interface Shape {

   void draw(); 

}

然后是创建实现接口的实体类“Rectangle”,“Square”,“Circle” :

public class Rectangle implements Shape {   
    @Override   
    public void draw() {      
        System.out.println("实现矩形画的方法...");   
    } 
}
public class Rectangle implements Shape {   
    @Override   
    public void draw() {      
        System.out.println("实现矩形画的方法...");   
    } 
}
public class Rectangle implements Shape {   
    @Override   
    public void draw() {      
        System.out.println("实现矩形画的方法...");   
    } 
}

接着就是创建一个工厂"ShapeFactory",生成基于给定信息的实体类的对象:

public class ShapeFactory {       
    //该方法获取形状类型的对象   
    public Shape getShape(String shapeType){      
        if(shapeType == null){         
            return null;      
        }              
        if(shapeType.equalsIgnoreCase("CIRCLE")){         
            return new Circle();      
        } else if(shapeType.equalsIgnoreCase("RECTANGLE")){         
            return new Rectangle();      
        } else if(shapeType.equalsIgnoreCase("SQUARE")){         
            return new Square();      
        }      
        return null;   
    } 
}

最后就是使用该工厂,通过传递类型信息来获取实体类的对象,并调用它的方法:

public class FactoryPatternDemo {    
    public static void main(String[] args) {      
        ShapeFactory shapeFactory = new ShapeFactory();       
        //获取 Circle 的对象,并调用它的 draw 方法      
        Shape shape1 = shapeFactory.getShape("CIRCLE");       
        //调用 Circle 的 draw 方法      
        shape1.draw();       
        //获取 Rectangle 的对象,并调用它的 draw 方法      
        Shape shape2 = shapeFactory.getShape("RECTANGLE");       
        //调用 Rectangle 的 draw 方法      
        shape2.draw();       
        //获取 Square 的对象,并调用它的 draw 方法      
        Shape shape3 = shapeFactory.getShape("SQUARE");      
        //调用 Square 的 draw 方法      
        shape3.draw();   
    } 
}

相信各位看到这都有一种顿悟的感觉把,没想到,工厂模式这么简单,而且实用。

如果我有什么不足的地方,请各位大佬指点出来,蟹蟹大家。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

black job

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值