zoukankan      html  css  js  c++  java
  • 工厂模式

    工厂模式

     概述:

      工厂模式具体包括了简单工厂、工厂方法、抽象工厂,它们是按照从简单到复杂的顺序排列的,属于设计模式中的创建型,其中简单工厂并不属于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连接数据库,硬件访问,降低对象的产生和销毁

  • 相关阅读:
    Nginx与Apache的对比
    gc buffer busy waits(ZT)
    Brocade SAN Switch Change Domain ID (ZT)
    Oracle异机恢复时报错ora19870 ora19507
    row cache lock (ZT)
    can a select block a truncate (ZT)
    NBU常用命令
    the RRD does not contain an RRA matching the chosen C
    Solaris10 x64安装64bit perl
    Solaris and Oracle 32bit Linking Error "fatal: symbol 'ntcontab'
  • 原文地址:https://www.cnblogs.com/shumeigang/p/13091725.html
Copyright © 2011-2022 走看看