这次不做标题党了,而且也怕自己总结的有问题,所以希望大家看到问题可以及时指正吧,一步一步的写设计模式笔记好了,毕竟设计模式还是太多了。不是单独去学就能完全掌握的,具体还是在实践中体会。接下来进入这次的主题:
简单工厂(静态工厂)
- 所属:创建型模式
- 意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
- 何时使用:我们明确地计划不同条件下创建不同实例时。
- 如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
- 关键代码:创建过程在其子类执行。
- 优点:
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。
比如说,想生产圆形、矩形、三角形。
假设已经有实体类Circle、Square、Rectangle三个类,里面各有show()方法:
那么main中我们需要这么做:
Circle oldCircle = new Circle();
Square oldSquare = new Square();
Rectangle oldRectangle = new Rectangle();
oldCircle.show();
oldSquare.show();
oldRectangle.show();
当然这调用也没啥问题。
不过这么做,我们需要new三个对象,写程序尽量不要随便使用new。原因后面会说。
所以我们选择创建一个工厂Factory,由他去生产,而我们要做的事情,就是传参~我们传参,他去根据参数的不同,去选择生产的对象。其实我在写策略模式的时候,总有错觉,这些设计模式非常相似,都是通过传各种各样参数去满足我们的需求。说多了。。。我们继续:
创建一个工厂类,他的任务就是接收参数,然后判断需要new出个什么。
/**
* Created by AceCream on 2017/4/1.
*/
public class ShapeFactory {
public Shape getShape(String string){
Shape shape = null;
switch (string){
case "Square":
shape = new Square();
break;
case "Circle":
shape = new Circle();
break;
case "Rectangle":
shape = new Rectangle();
break;
}
return shape;
}
}
上面的代码就是,我通过获取到字符串,返回Shape类型,Shape是个接口,里面有我们图形类必须有的show()方法,这时候图形类只需要实现Shape这个接口即可~
Ps:说一下,尽量不要瞎用if...else,因为每一次选择你都需要判断很多条件。
例如:
public class Circle implements Shape{
@Override
public void show() {
System.out.println("我是圆形...");
}
}
随后我们看一下实现类:
/**
* Created by AceCream on 2017/4/1.
*/
public class ShapeDemo {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
Shape circle = shapeFactory.getShape("Circle");
circle.show();
Shape rectangle = shapeFactory.getShape("Rectangle");
rectangle.show();
Shape square = shapeFactory.getShape("Square");
square.show();
}
}
看!我只new了一个工厂,当我需要Circle的时候,我就告诉工厂:“你去查查看,生产个Circle给我”。他就去找,然后new出一个Circle返回给我。这里很好的利用了面向对象的封装和多态!这就是简单工厂咯~
至于抽象工厂,我给大家贴个图:
简单解释一下:Red、Green、Blue类是颜色,由ColorFactory生产,剩下的那部分还是和上面一样由ShapeFactory生产。
多了个啥?
/**
* Created by AceCream on 2017/4/1.
* 抽象工厂
* 为 Color 和 Shape 对象创建抽象类来获取工厂。
*/
public abstract class AbstractFactory {
abstract Color getColor(String color);
abstract Shape getShape(String shape);
}
对~就是上面这玩意,用了就是抽象工厂了。
其实感觉抽象工厂模式挺臃肿的,而且个人感觉啊,不是很喜欢它。而事实也是:基本上很多人一辈子都用不上它,所以我给自己的标准是——重要的东西必须弄个明白!但是脑容量有限,剩下的知道大概就好了,用时候就去查也能马上捡起来。
后面的话(个人的阶段学习体会,可以跳过)
所以!我会困惑为什么需要工厂模式?
是的,如果是我们日常写代码,使用设计模式可能反而会变得复杂,但是如果工程项目大了起来,设计模式就显得尤为重要了!这里转一句知乎大神的一句话:
在实际的项目中,在你通往架构师的道路上,你要培养出一种感觉:要new一个实体对象是件很谨慎的事情(不是指值对象),不要随便new。最好不要自己new,让别人去new,传给你去调用。这样new错了也是别人的事,换而言之你的模块是好质量的,禁得起推敲的。那么都不愿意去new,谁去new?让专门的一个工厂去new。请注意:这仅仅是解决new的方式之一,此外还要反射啊等等。那你必须要等到真正接触大型项目才能有体味的。
作者:余叶
链接:https://www.zhihu.com/question/24843188/answer/49197026
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
我发现当项目阅历不足够的时候去学习设计模式是一件很费力的事情,因为没接触过大的项目,就没有遇到过特定的需求,一直通过自己研究的小的东西,然后跳过实战去看原理、去奢求,不足以让我们去宏观的看问题。
所以我这几天给自己的警醒是:
实践很重要,在实践中去思考更重要。跳过实践去研究原理,研究明白一时,到了该用的时候不知道咋用~岂不是很悲哀?
此文参考:
菜鸟教程——工厂模式