设计模式——工厂模式

1.简单工厂模式

简单工厂模式是指由一个工厂对象决定创建哪一种产品的实例,但他不属于Gof的23种设计模式。简单工厂模式适用于工厂类负责创建对象较少的场景,且客户端只需要传入工厂类的参数,对于如何创建对象不需要关心
以下为实例
创建课程接口ICourse:

public interface ICourse {
	//定义方法
	public void record();

}

定义ICourse的实现类

public class JavaCouse implements ICourse {

	@Override
	public void record() {
		System.out.println("Java课程");
	}

}
public class PythonCouse implements ICourse {

	@Override
	public void record() {
		System.out.println("Python课程");
	}

}

定义工厂创建类CourseFactory:

public class CourseFactory {
	
	public ICourse creste(Class<? extends ICourse> clazz) {

		try {
			if (null != clazz) {
				return clazz.newInstance();
			}
		} catch (InstantiationException | IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return null;

	}

}

客户端实现如下

public static void main(String args[]) {
		CourseFactory factory = new CourseFactory();
		ICourse course = factory.creste(JavaCouse.class);
		course.record();
		course = factory.creste(PythonCouse.class);
		course.record();
}

实现结果为

Java课程 
Python课程

简单工厂模式也有它的缺点
工厂类的职责相对过重,不易于扩展过于复杂的产品结构

2.工厂方法模式

工厂方法模式是指定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法模式让类的实例化推迟到子类中进行。在工厂方法模式中用户只需要关心所需产品对应的工厂无需关心创建细节,而且加入新的产品时符合开闭原则、
工厂方法模式主要解决产品扩展的问题。在简单工厂模式中,随着产品链的丰富,如果每个课程的创建逻辑有区别,则工厂的职责变得越来越多,有点像万能工厂,不便于维护。根据单一职责原则我们将代码继续拆分,专人干专事
以下为实例
创建课程接口ICourse:

public interface ICourse {
	//定义方法
	public void record();

}

定义ICourse的实现类

public class JavaCouse implements ICourse {

	@Override
	public void record() {
		System.out.println("Java课程");
	}

}
public class PythonCouse implements ICourse {

	@Override
	public void record() {
		System.out.println("Python课程");
	}

}

创建CourseFactory接口:

public interface CourseFactory {
	
	ICourse create();
	
}

再分别创建子工厂JavaCourseFactory,PythonCourseFactory

public class JavaCourseFactory implements CourseFactory {

	@Override
	public ICourse create() {
		return new JavaCourse();
	}

}
public class PythonCourseFactory implements CourseFactory {

	@Override
	public ICourse create() {
		return new PythonCourse();
	}

}

测试代码如下:

public static void main(String args[]) {
		CourseFactory factory = new JavaCourseFactory();
		ICourse course = factory.create();
		course.record();
		
		factory = new PythonCourseFactory();
		course = factory.create();
		course.record();
}

运行结果:

Java课程
Python课程

工厂方法模式适用于以下场景:
1.创建对象需要大量重复代码
2.客户端(应用层)不依赖于产品类实力如何被创建,如何被实现的细节
3.一个类通过其子类来指定创建哪个对象
工厂方法也有缺点:
1.类的个数容易过多,增加复杂度
2.增加了系统的抽象性和理解难度

3.抽象工厂模式

抽象工厂模式是指提供一个创建一系列相关或相互依赖对象的接口,无须指定他们的具体类。客户端(应用层)不依赖于产品类实例如何被创建,如何被实现等细节,强调的是一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复代码。需要提供一个产品类的库,所有产品同样以接口出现,从而使客户端不依赖具体实现
示例如下
首先创建产品等级中的产品接口

public interface INote {
	void edit();
}
public interface IVideo {
	void record();
}

然后创建一个抽象工厂类

public interface CourseFactory {
	INote createNote();
	IVideo createVideo();
}

接下来创建Java产品族的实现

public class JavaNote implements INote {

	@Override
	public void edit() {
		// TODO Auto-generated method stub
		System.out.println("Java笔记");
	}

}
public class JavaVideo implements IVideo {

	@Override
	public void record() {
		// TODO Auto-generated method stub
		System.out.println("Java视频");
	}

}

创建Java产品族的具体工厂

public class JavaCourseFactory implements CourseFactory {

	@Override
	public INote createNote() {
		// TODO Auto-generated method stub
		return new JavaNote();
	}

	@Override
	public IVideo createVideo() {
		// TODO Auto-generated method stub
		return new JavaVideo();
	}

}

下面是Python产品族

public class PythonNote implements INote {

	@Override
	public void edit() {
		// TODO Auto-generated method stub
		System.out.println("Python笔记");
	}

}
public class PythonVideo implements IVideo {

	@Override
	public void record() {
		// TODO Auto-generated method stub
		System.out.println("Python视频");
	}

}
public class PythonCourseFactory implements CourseFactory {

	@Override
	public INote createNote() {
		// TODO Auto-generated method stub
		return new PythonNote();
	}

	@Override
	public IVideo createVideo() {
		// TODO Auto-generated method stub
		return new PythonVideo();
	}

}

客户端调用代码
public class AbstractFactoryTest {
	
	public static void main(String args[]) {
		CourseFactory factory = new JavaCourseFactory();
		factory.createNote().edit();
		factory.createVideo().record();
		factory = new PythonCourseFactory();
		factory.createNote().edit();
		factory.createVideo().record();
	}

}

运行结果

Java笔记
Java视频
Python笔记
Python视频

抽象工厂模式非常清晰的体现了不同产品族与产品之间的联系但不符合开闭原则
所以抽象工厂模式也是有缺点的
1.规定了所有可能被创建的产品集合,产品族中扩展新产品困难,需要修改抽象工厂的接口
2.增加了系统的抽象性和理解难度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值