1、为什么要使用工厂模式?
比方说,一位滴滴司机,如果要去开车挣钱的话,他得自己会制造汽车,然后,才能使用汽车挣
钱;对于这位司机来说,要求很高了,毕竟汽车很难制造出来;
如果使用工厂模式的话,这位司机,只需要知道汽车工厂就可以了,直接去工厂提车就行。从而降
低了对司机的技能要求。
2、工厂模式的核心本质是什么?
1、实例化对象。用工厂方法代替new操作
2、将选择实现类,创建对象的过程 进行统一的管理和控制;将调用者/客户端跟具体的实现进行解耦
3、应用场景?
A、JDK中Calendar的getInstance方法
B、JDBC中Connection对象的获取
C、Hibernate中SessionFactory创建Session
D、Spring中IOC容器创建管理bean对象
4、工厂模式的分类?
A、简单工厂模式
B、工厂方法模式
C、抽象工厂模式
5、简单工厂模式
5.1要点:
A、简单工厂模式也称为静态工厂模式,因为工厂类里一般都是使用静态方法
通过接收不同的参数来创建不同的对象实例
B、扩展性:必须修改工厂类的代码,才能进行扩展。
6 工厂方法模式
6.1要点:
A、每一实例对象,都对应着一个工厂;不再集中创建实例
B、扩展性:可以通过增加新的工厂类实现扩展,无需修改原来的代码
7、抽象工厂模式
7.1要点:
A、对不同实例对象进行组合(用来生产不同产品族的全部产品)
B、支持增加产品组,不能增加新的产品;
7.2抽象工厂代码实例:
第一,定义三个产品类
package com.xingej.patterns.factory.abstractfactory;
public interface Seat {
void say();
}
class LowSeat implements Seat {
@Override
public void say() {
System.out.println("----我是低级的车座哦-----");
}
}
class HighSeat implements Seat {
@Override
public void say() {
System.out.println("---我是高级的车座哦-----");
};
}package com.xingej.patterns.factory.abstractfactory;
public interface Wheel {
void showInfo();
}
class LowWheel implements Wheel {
@Override
public void showInfo() {
System.out.println("----我是低级车轮哦----");
}
}
class HighWheel implements Wheel {
@Override
public void showInfo() {
System.out.println("----我是高级车轮哦-----");
}
}package com.xingej.patterns.factory.abstractfactory;
public interface Engine {
void show();
}
class HighEngine implements Engine {
@Override
public void show() {
System.out.println("----我是高级引擎哦----");
}
}
class LowEngine implements Engine {
@Override
public void show() {
System.out.println("---我是低级引擎哦----");
}
}第二、定义一批产品组接口
package com.xingej.patterns.factory.abstractfactory;
/**
* 定义了一批产品组
*
* @author erjun 2017年11月9日 下午1:49:33
*/
public interface CarFactory {
Engine buildEngine();
Seat buildSeat();
Wheel buildWheel();
}第三、实现不同的产品组
package com.xingej.patterns.factory.abstractfactory;
public class HighCarFactory implements CarFactory {
@Override
public Engine buildEngine() {
return new HighEngine();
}
@Override
public Seat buildSeat() {
return new HighSeat();
}
@Override
public Wheel buildWheel() {
return new HighWheel();
}
}package com.xingej.patterns.factory.abstractfactory;
public class LowCarFactory implements CarFactory {
@Override
public Engine buildEngine() {
return new LowEngine();
}
@Override
public Seat buildSeat() {
return new LowSeat();
}
@Override
public Wheel buildWheel() {
return new LowWheel();
}
}测试:
package com.xingej.patterns.factory.abstractfactory;
import org.junit.Test;
public class AbstractFactoryTest {
@Test
public void testAbstractFactory() {
CarFactory factory = new HighCarFactory();
Engine highEngine = factory.buildEngine();
highEngine.show();
Seat highSeat = factory.buildSeat();
highSeat.say();
Wheel highWheel = factory.buildWheel();
highWheel.showInfo();
}
}8、总结:
1、简单工厂,对象的创建都是在一个工厂类里实现的;(一般通过传入不同的参数,来返回不同的对象)
2、工厂方法,给每个对象都创建一个工厂,也就是说,对象的创建都分配给不同的工厂去实现,不
在集中在一个工厂里实现;
3、抽象工厂,在一个工厂里,创建一系列彼此之间有关系的对象;比方说,抽象笔记本工厂里,可
以创建主板,显卡,处理器,鼠标等等
简单工厂,工厂方法模式
代码已经上传到git上了
https://github.com/xej520/xingej-design-patterns
本文出自 “XEJ分布式工作室” 博客,请务必保留此出处http://xingej.blog.51cto.com/7912529/1981388
原文地址:http://xingej.blog.51cto.com/7912529/1981388