工厂模式

工厂模式

 概述:

  工厂模式具体包括了简单工厂、工厂方法、抽象工厂,它们是按照从简单到复杂的顺序排列的,属于设计模式中的创建型,其中简单工厂并不属于GOF的23中模式。但是它是理解其它的工厂模式的一个很好的基础,所以很多人在讲述设计模式的时候会提到简单工厂模式。创建型模式关注的是对象的创建,创建型模式将创建对象的过程进行了抽象,也可以理解为将创建对象的过程进行了封装,作为客户程序仅仅需要去使用对象,而不再关心创建对象过程中的逻辑。

 

定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

 Product为抽象产品类负责定义产品的共性,实现对事物最抽象的定义;

Creator为抽象创建类,也就是抽象工厂,具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的。

面向对象设计的六大基本原则:

  SRP(单一职责原则,Single Responsibility Principle):就一个类而言,应该仅有一个引起它变化的原因。简单来说,一个                   类中应该是一组相关性很高的函数、数据的封装。

  OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对扩展开放,对修改关闭

        LSP(里式替换原则,Liskov Substitution Principle):所有引用基类的地方必须能透明地使用其子类的对象。通俗点讲,只要               父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类                 还是子类。但是,反过来就不行了,有子类出现的地方,父类未必就能适应。

     DIP(依赖倒转原则,Dependence Inversion Principle):要针对接口编程,不要针对实现编程

     ISP(接口隔离原则,Interface Segregation Principles):客户端不应该依赖它不需要的接口

        LoD(迪米特法则,Law of Demeter):只与你直接的朋友通信,而避免和陌生人通信


工厂模式的意义:便于拓展,易于维护

具体工厂类代码:

 实现图:

 

1 simpleFactory 简单工厂 创建Shape接口(Shape.cs)

public interface Shape {
    void draw();
}

2 simpleFactory 简单工厂 "圆" 创建(Circle.cs)

/*
圆
 */
public class Circle implements   Shape {

    public Circle() {
        System.out.println(" a Circle");
    }

    @Override
    public void draw() {
        System.out.println(" Draw a Circle ");
    }
}

3 simpleFactory 简单工厂 "正方形" 创建(Square.cs)

/*
正方形
 */

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

    @Override
    public void draw() {
        System.out.println("Draw Square");
    }
}

4 simpleFactory 简单工厂 "长方形" 创建(Rectangle.cs)

/*
长方形
 */
public class Rectangle implements Shape {
    public Rectangle() {
        System.out.println("a Rectangle");
    }
    @Override
    public void draw() {
        System.out.println("Draw a Rectangle");
    }
}

5 工厂模式 factoryMethod   增加一个工厂接口:(Factory.cs)

package Factory.factoryMethod;

import Factory.simpleFactory.Shape;

public interface  Factory {
    public Shape getShape();
}

6.1 工厂模式 factoryMethod  增加相关工厂类(圆形):

圆形工厂类

package Factory.factoryMethod;
import Factory.simpleFactory.Circle;
import Factory.simpleFactory.Shape;

public class CircleFactory  implements Factory{

    @Override
    public Shape getShape() {

        return new Circle();
    }
}

6.2工厂模式 factoryMethod  增加相关工厂类(长方形):

长方形工厂类

import Factory.simpleFactory.Circle;
import Factory.simpleFactory.Rectangle;
import Factory.simpleFactory.Shape;

public class RectangleFactory implements Factory {
    @Override
    public Shape getShape() {
        return new Rectangle();
    }
}

6.3 工厂模式 factoryMethod 增加相关工厂类(正方形):

正方形工厂类

import Factory.simpleFactory.Rectangle;
import Factory.simpleFactory.Shape;
import Factory.simpleFactory.Square;

public class SquareFactory implements Factory {
    @Override
    public Shape getShape() {
        return new Square();
    }
}

7测试:

 

import Factory.simpleFactory.Shape;

public class TestFactoryMethod {
public static void main(String[] args)
{
Factory circleFactory=new RectangleFactory();
Shape circle = circleFactory.getShape();
circle.draw();
}
}

结果:

a Rectangle
Draw a Rectangle

 

简单工厂模式:

一个模块仅需要一个工厂类,没有必要把它产生出来,使用静态的方法

多个工厂类:

每个人种(具体的产品类)都对应了一个创建者,每个创建者独立负责创建对应的产品对象,非常符合单一职责原则

代替单例模式:

单例模式的核心要求就是在内存中只有一个对象,通过工厂方法模式也可以只在内存中生产一个对象

延迟初始化:

ProductFactory负责产品类对象的创建工作,并且通过prMap变量产生一个缓存,对需要再次被重用的对象保留

使用场景:jdbc连接数据库,硬件访问,降低对象的产生和销毁

posted @ 2020-06-11 10:28  meigang  阅读(84)  评论(0编辑  收藏  举报