本质
不使用new创建对象,而是用工厂。
工厂类图示例
有一个工厂,在工厂内部来new对象。因此我们在main中只需要传参给工厂类即可。
更具体一点:
代码如下
接口
public interface Shape {
void draw();
}三个类
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("画长方形");
}
}工厂类(可以看到,工厂根据传过来的参数进行对应的new对象)
public class Factory {
//使用 getShape 方法获取形状类型的对象
public Shape getShape(String shape){
if(shape == null){
return null;
}
if(shape.equals("圆")){
return new Circle();
} else if(shape.equals("长方形")){
return new Rectangle();
} else if(shape.equals("正方形")){
return new Square();
}
return null;
}
}main方法,此时我想要调用相关对象的draw方法。
public class Main {
public static void main(String[] args){
//
Factory factory = new Factory();
Shape shape1= factory.getShape("圆");
shape1.draw();
Shape shape2= factory.getShape("长方形");
shape2.draw();
Shape shape3= factory.getShape("正方形");
shape3.draw();
}
}
运行结果:
画圈圈 画长方形 画正方形.
小结
优点:
- 一个调用者想创建一个对象,只要知道其名称就可以了。上面的我输入的是圆就可以建对象,而不是类名Circle
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
- 屏蔽产品的具体实现,调用者只关心产品的接口。
个人理解:看其他博客,好像我的示例是简单工厂,但工厂模式与简单工厂特别相似。简单工厂是一个工厂什么都造,而工厂模式比较专一,比如本例,如果用三个工厂,分别对应3个不同的Shape,那么就形成了工厂模式。可以理解成一个工厂对应一类产品,多个工厂就共同构成了工厂模式,这样是一个解耦的过程。



京公网安备 11010502036488号