工厂模式
首先理解一下工厂模式的含义
工厂模式 类似于Java的多态 , 当你有一个动物的模板(父类) , 而你想要一些狮子,老虎,绵羊等不同的动物(子类) 在不使用工厂模式下,每次获取都需要写一个字类来继承 动物类
使用了工厂模式 就是一种更好的 更精明的方式
创造一个动物工厂,将这个动物特有的特性告诉他,工厂自动实例化一个你想要的动物。
优点:
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
代码:
package sun.framework.genesis.beta.designmode.factory;
/**
* @Auther: SunDC
* @Date: 2019/11/4 10:29
* @Description:
*/
public interface Shape {
void draw();
}
package sun.framework.genesis.beta.designmode.factory;
/**
* @Auther: SunDC
* @Date: 2019/11/4 10:31
* @Description:
*/
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
package sun.framework.genesis.beta.designmode.factory;
/**
* @Auther: SunDC
* @Date: 2019/11/4 10:31
* @Description:
*/
public class Circle implements Shape{
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
package sun.framework.genesis.beta.designmode.factory;
/**
* @Auther: SunDC
* @Date: 2019/11/4 10:32
* @Description:
*/
public class ShapeFactory {
public Shape getShape(String shapeType){
if(shapeType == null){
return null;
}
if(shapeType.equalsIgnoreCase("CIRCLE")){
return new Circle();
} else if(shapeType.equalsIgnoreCase("RECTANGLE")){
return new Rectangle();
}
return null;
}
}
package sun.framework.genesis.beta.designmode.factory;
/**
* @Auther: SunDC
* @Date: 2019/11/4 10:33
* @Description: 创建一个绘画工厂 传入不同的参数 返回不同的形状(绘画的字类)
*
*
*
*/
public class FactoryPatternDemo {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
//获取 Circle 的对象,并调用它的 draw 方法
Shape shape1 = shapeFactory.getShape("CIRCLE");
//调用 Circle 的 draw 方法
shape1.draw();
//获取 Rectangle 的对象,并调用它的 draw 方法
Shape shape2 = shapeFactory.getShape("RECTANGLE");
shape2.draw();
}
}
最经典的工厂模式 – 数据库连接时的工厂