关于设计模式学习初衷:在面试的时候,有四五次都被问到了设计模式的问题,比较遗憾的是,自己一个也没有答上来.开始比较厌恶去参加什么所谓的培训班,开始工作后,有了一些自己的时间,在网上买了<大话设计模式>一书,在读了几张后发现很有意思的一本书,对我启发很大.于是计划在接下来的时间里,对这一块进行集中的学习.
来自网络上的一些资料:
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
介绍
意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
主要解决:主要解决接口选择的问题。
何时使用:我们明确地计划不同条件下创建不同实例时。
如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
关键代码:创建过程在其子类执行。
优点:
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、 屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
自己写的一个简单例子:
//抽象产品类
public interface Cars {
void GetCar();
}
//实现接口的实体类
public class JeepCar implements Cars {
@Override
public void GetCar() {
System.out.println("this is JeepCar.");
}
}
public class SportCar implements Cars {
@Override
public void GetCar() {
System.out.println("this is SportCar.");
}
}
//工厂类
public class CarFactory {
public Cars GetCar(String carType) {
if (carType == null) {
return null;
}
if (carType.equalsIgnoreCase("SportCar")) {
return new SportCar();
} else if (carType.equalsIgnoreCase("jeepcar")) {
return new JeepCar();
}
return null;
}
}
//使用工厂,通过传递类型信息来获取实体类的对象
public class FactoryPatternDemo {
public static void main(String[] args) {
CarFactory carFactory = new CarFactory();
Cars jeep = carFactory.GetCar("jeepcar");
jeep.GetCar();
Cars sport = carFactory.GetCar("sportcar");
sport.GetCar();
}
}
写给自己,也写给读者:在学习这块的时候,按照网上的例子原样写了几次,然后发现照抄是没有意义的.越复制,越迷糊.然后开始参考例子再举例子,然后就开始渐渐领悟了.希望后面的自己,不要一直做复制者,要做一些属于自己的东西.也希望后面的自己能去不断的补充和完善这些东西.领悟更核心的东西.
后续补充摘录:
(1)简单工厂模式是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的。
(2)工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成。
(3)抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。它针对的是有多个产品的等级结构。而工厂方法模式针对的是一个产品的等级结构。