设计模式 --简单工厂模式

从现在开始要好好地整理一下以前学习的东西,就从最近学习的设计模式开始吧。刚开始写可能会不全面慢慢学习慢慢写吧。
在学习设计模式之前先学习一下设计模式的六大原则:

- 单一职责原则:一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。
单一职责原则是实现高内聚、低耦合的指导方针,它是最简单但又最难运用的原则,需要设计人员发现类的不同职责并将其分离,而发现类的多重职责需要设计人员具有较强的分析设计能力和相关实践经验。
- 开闭原则:一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类。为了满足开闭原则,需要对系统进行抽象化设计,抽象化是开闭原则的关键
- 里氏替代原则:所有引用基类(父类)的地方必须能透明地使用其子类的对象。在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象。在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。
- 依赖倒置原则:如果说开闭原则是面向对象设计的目标的话,那么依赖倒转原则就是面向对象设计的主要实现机制之一,它是系统抽象化的具体实现。依赖倒转原则是Robert C. Martin在1996年为“C++Reporter”所写的专栏Engineering Notebook的第三篇,后来加入到他在2002年出版的经典著作“Agile Software Development, Principles, Patterns, and Practices”一书中。依赖倒转原则定义如下:抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。
依赖倒转原则要求我们在程序代码中传递参数时或在关联关系中,尽量引用层次高的抽象层类,即使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型声明,以及数据类型的转换等,而不要用具体类来做这些事情。为了确保该原则的应用,一个具体类应当只实现接口或抽象类中声明过的方法,而不要给出多余的方法,否则将无法调用到在子类中增加的新方法。
- 接口隔离原则:使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
根据接口隔离原则,当一个接口太大时,我们需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。每一个接口应该承担一种相对独立的角色,不干不该干的事,该干的事都要干。这里的“接口”往往有两种不同的含义:一种是指一个类型所具有的方法特征的集合,仅仅是一种逻辑上的抽象;另外一种是指某种语言具体的“接口”定义,有严格的定义和结构,比如Java语言中的interface.
- 迪米特法则:一个软件实体应当尽可能少地与其他实体发生相互作用
如果一个系统符合迪米特法则,那么当其中某一个模块发生修改时,就会尽量少地影响其他模块,扩展会相对容易,这是对软件实体之间通信的限制,迪米特法则要求限制软件实体之间通信的宽度和深度。迪米特法则可降低系统的耦合度,使类与类之间保持松散的耦合关系。
第一个设计模式为简单工厂模式:
定义:简单工厂模式属于创建者模式,又叫静态工厂方法模式,但不属于23中GOF设计模式之一。
简单工厂模式是有一个工厂对象决定创建出哪一种产品类的示例。简单工厂模式是工厂模式家族中最简单的模式
加入有一个形状接口,有三个实现类实现了这个接口。有一个工厂来根据要求创建相应的工厂。
这里写图片描述
Shape类:

public interface Shape {
    void draw();
}

Circle 类:

public class Circle implements Shape{
    public void draw() {
        System.out.println("draw a circle");
    }
}

Square类:

public class Square implements Shape{
    public void draw() {
        System.out.println("draw a Square");
    }
}

Rectangle 类:

public class Rectangle implements Shape{
    public void draw() {
        System.out.println("draw a Rectangle");
    }
}

Factory 类:

public class Factory {
    Shape getShape(String shapeStr) {
        Shape shape;
        switch(shapeStr) {
            case "circle":
                shape = new Circle();
                break;
            case "square":
                shape = new Square();
                break;
            case "rectangle":
                shape = new Rectangle();
                break;
            default:
                shape = null;
        }
        return shape;
    }
}

Client 类:

import org.junit.Test;

public class Client {
    @Test
    public void FactoryTest() {
        Factory fac = new Factory();
        Shape circle = fac.getShape("circle");
        if (circle != null) {
            circle.draw();
        }
        Shape square = fac.getShape("square");
        if (circle != null) {
            square.draw();
        }
        Shape rectangle = fac.getShape("rectangle");
        if (circle != null) {
            rectangle.draw();
        }
    }

}

这样使用Factory 工厂来创建不同的shape类;将不同的形状类型实现同一的Shape接口。如果想要增加新的想形状类型,只需要多写一个形状类实现Shape接口,并在Factory中增加一个case即可

猜你喜欢

转载自blog.csdn.net/qq_18461571/article/details/80645249