工厂模式
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
-
优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。
-
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
-
使用场景: 1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
简单的工厂模式
/**
* 工厂类
**/
public interface FactoryParent(){
// 工厂制造机器
public viod machine();
}
/**
* 工厂里面制造 一个工厂里面可以实现多个制造 每一个制造类都需要实现工厂 比如
**/
public class MakeProduct implements FactoryParent {
// 工厂制造机器
public viod machine(){
System.out.println("一号制造");
}
}
/**
* 工厂调用
**/
public class CourseFactory {
/**
*
* @param className 调用工厂
* @return
*/
public FactoryParent course(Class className){
try{
if (!(null == className || ("").equals(className))){
return (FactoryParent) className.newInstance ();
}
}catch (Exception e){
e.fillInStackTrace();
}
return null;
}
}
public class SimpleTest {
/**
* 通过工厂调用直接制造
**/
@Test
public void SimpleTest(){
CourseFactory cf = new CourseFactory();
FactoryParent course= cf.course(MakeProduct.class);
course.record();
}
}
简单工厂只能解决创建逻辑非常复杂、对于用户而言更加简化、简化了调用逻辑。一般适用于产品相当稳定,业务逻辑不能复杂。工厂模式一般都用于jar ,所以调用端一般只需要传入一个正确的参数,就可以获取所需的对象。
工厂方法模式
工厂方法模式是指定义一个创建对象接口,但是实例化这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。 解决产品不断的丰富、以及业务越来越复杂。
/**
* 工厂类
**/
public interface FactoryParent(){
// 工厂制造机器
public viod machine();
}
/**
* 工厂里面制造 一个工厂里面可以实现多个制造 每一个制造类都需要实现工厂 比如
**/
public class makeProduct implements FactoryParent {
// 工厂制造机器
public viod machine(){
System.out.println("一号制造");
}
}
/**
* 工厂调用
**/
public class CourseFactory {
/**
*
* @param className 调用工厂
* @return
*/
public FactoryParent course(Class className){
try{
if (!(null == className || ("").equals(className))){
return (FactoryParent) className.newInstance ();
}
}catch (Exception e){
e.fillInStackTrace();
}
return null;
}
}
/**
* 工厂的父类
**/
public interface FactoryParentFacory {
ICourse create();
}
/**
* 工厂的实现 根据不同的需求创建不一样的工厂
**/
public class JavaCourseFactory implements FactoryParentFacory {
public ICourse create() {
return new JavaCourse();
}
public class SimpleTest {
/**
* 通过工厂调用直接制造
**/
@Test
public void FactoryMethodTest(){
CourseFactory cf = new CourseFactory();
FactoryParent course= cf.course(JavaCourse.class);
course.record();
}
}
在工厂方法模式 带入了开闭原则
开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类等,后面的具体设计中我们会提到这点。