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