美文网首页
设计模式-工厂模式

设计模式-工厂模式

作者: awanke | 来源:发表于2019-03-06 15:31 被阅读0次

    设计模式-工厂模式

    最近学习到工厂模式,记录下学习过程

    参考资料

    主要参考了这篇文章https://blog.51cto.com/liukang/1981900

    核心思想

    工厂模式主要是为了满足开闭原则,开闭原则可以理解为,流水线生产,需要产品就直接获取成品,屏蔽掉创建过程,提高效率。

    例子

    仍然是做一个画图软件,可以画矩形、三角形和圆形等,每一种图形都用一个类来管理:

    • Rectangle
    • Circle
    • Triangle
      每个类都有各自的draw()方法,共同实现Shape接口。

    Shape.java

    
    public interface Shape {
       void draw();
    }
    
    Rectangle.java
    
    public class Rectangle implements Shape {
       @Override
       public void draw() {
          System.out.println("Draw a rectangle.");
       }
    }
    
    Triangle.java
    
    public class Triangle implements Shape {
       @Override
       public void draw() {
          System.out.println("Draw a triangle.");
       }
    }
    
    Circle.java
    
    public class Circle implements Shape {
       @Override
       public void draw() {
          System.out.println("Draw a circle.");
       }
    }
    

    以上几个类都没有变化,有变化的是工厂类,工厂类也采用基于接口的设计,由不同的具体工厂类负责相应对象的创建:

    ShapeFactory.java
    
    public interface ShapeFactory {
        Shape getShape();
    }
    RectangleFactory.java
    
    public class RectangleFactory implements ShapeFactory {
        public Shape getShape() {
            return new Rectangle();
        }
    }
    
    CircleFactory.java
    
    public class CircleFactory implements ShapeFactory{
        public Shape getShape() {
            return new Circle();
        }
    }
    Triangle.Factory.java
    
    public class CircleFactory implements ShapeFactory{
        public Shape getShape() {
            return new Circle();
        }
    }
    

    那么在需要某个形状的时候,就通过相应的具体工厂类创建即可:

    Client.java
    
    public class Client {
        public static void main(String[] args) {
            ShapeFactory factory = new CircleFactory();
            Shape c = factory.getShape();
            c.draw();
        }
    }
    

    相关文章

      网友评论

          本文标题:设计模式-工厂模式

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