java设计模式-工厂方法模式
简单说一下
说下什么是工厂方法设计模式:工厂方法设计模式也是java中比较常用的设计模式之一,定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类中,从而满足创建型模式中所要求的“创建与使用相分离”的特点。
工厂方法模式主要解决了接口选择的问题,在明确计划不同条件下创建不同实例时可以使用工厂方法设计模式,让其子类实现工厂接口,返回的也是一个抽象的产品。
举个栗子说吧,你需要一辆法拉利跑车,可以直接从工厂里边提货,而不用管法拉利怎么制造的以及怎么实现的。
顺便说一下
可能大家对工厂方法模式和简单工厂模式的理解有些模糊。
1.如果要创建的产品不多,只要一个类就能完成,这种模式叫做简单工厂模式,但是他不属于GOF23设计模式,他的缺点是增加新产品的时候回违背开闭原则
2.而我们在此要介绍的工厂方法模式是对简单工厂模式的进一步抽象化,他给我们带来的好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则
3.所谓上面的开闭原则就是:规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”,换句话说就是某个软件应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化的。
稍微夸一下
那么工厂方法设计模式有什么特点呢:
1.一个调用者想创建某个对象,只要知道该对象的名称就行了
2.扩展性高,如果想增加一个新的产品,在多创建一个工厂类就行了
3.只需要关心接口,而不需要关心接口里边的具体实现
狠狠吐一下
缺点缺点缺点(重要的事情说三遍!!!):
其实这个缺点我们从他的优点中就可以推理出来,虽然他的扩展性高,增加新的产品就创建一个新的类看似简单,但是这无疑增加了系统的复杂度,同时也增加了系统具体类的依赖。
着重讲一下
工厂方法模式由抽象工厂、具体工厂、抽象产品和具体产品等4个要素构成:
1.抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法newProduct() 来创建产品。
2.具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
3.抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
4.具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
从网上当了个图解
多多用一下
实例代码如下:准备工具:shape接口,circle、square、rectangle实现类,shapeFactory工厂,FactoryPattern类获取信息。
详细如下:
1.创建一个shape接口,声明draw方法
public interface Shape {
void draw();
}
2.创建实现接口的三个实体类
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("这是一个圆形");
}
}
------------------------------------------
public class Square implements Shape {
@Override
public void draw() {
System.out.println("这是一个正方形");
}
}
------------------------------------------
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("这是一个长方形");
}
}
3.创建一个工厂,生成基于给定信息的实体类的对象
public class ShapeFactory {
public Shape getShape(String shapeType){
if(shapeType == null){
return null;
}
if(shapeType.equalsIgnoreCase("circle")){
return new Circle();
}else if(shapeType.equalsIgnoreCase("square")){
return new Square();
}else if(shapeType.equalsIgnoreCase("rectangle")){
return new Rectangle();
}
return null;
/*equalsIgnoreCase:和equals的区别是不需要考虑字符大小写*/
}
}
4.使用该工厂,通过传递类型信息来获取实体类对象
public class FactoryPattern {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
/*获取Circle对象*/
Shape shape1 = shapeFactory.getShape("circle");
/*调用其Circle的draw方法*/
shape1.draw();
/*获取Square对象*/
Shape shape2 = shapeFactory.getShape("square");
/*调用其Square的draw方法*/
shape2.draw();
/*获取Rectangle对象*/
Shape shape3 = shapeFactory.getShape("rectangle");
/*调用其Rectangle的draw方法*/
shape3.draw();
}
}
5.运行结果输出
这是一个圆形
这是一个正方形
这是一个长方形