提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
工厂模式——简单工厂模式、工厂方法模式、抽象工厂模式
一、问题描述
问题1.图形工厂
使用简单工厂模式设计一个可以创建不同几何形状(Shape)的绘图工具类,如可创建圆形(Circle)、矩形(Rectangle)和三角形(Triangle)对象,每个几何图形均具有绘制draw()和擦除erase()两个方法,要求在绘制不支持的几何图形时,抛出一个UnsupportedShapeException异常,设计类图并编程实现。
问题2.图片读取器
某系统设计一个图片读取器(ImageReader),用来读取各种不同类型的图片格式,例如GIF图片读取器(GifReader)用于读取GIF格式的图片、 JPG图片读取器(JpgReader)用于读取JPG格式的图片,现使用工厂方法模式设计该系统类图并编程实现。
问题3.电器工厂
一个电器工厂可以产生多种类型的电器,如海尔工厂可以生产海尔电视机、海尔空调等,TCL工厂可以生产TCL电视机、TCL空调等,相同品牌的电器构成一个产品族,而相同类型的电器构成了一个产品等级结构,现使用抽象工厂模式模拟该场景,设计类图并编程实现
二、问题分析
问题一类图:
问题二类图:
问题三类图:
三、几个工厂模式优缺点
简单工厂模式:
1.简单工厂模式的优点
方便扩展算法,比如增加图形,我们只要继续增加图形类就行了,同时客户端也就是使用者不知道具体的实现细节,只要给出相关标示符,工厂函数就马上给他创建一个他想要的实体就行了。减少了使用者和功能开发者之间的耦合度。
2.简单工厂模式的优点
在进行扩展的时候,我们要更改工厂函数里面的对应函数,这样便破坏了OCP,而且当有多级结构继承的时候,简单工厂就会因为只能对应平行一层记得继承,不得不使得好多类继承同一个接口,然后得到A*B这么多的工厂实体可能,工厂函数很难维护
工厂方法模式:
1.工厂方法模式的优点
算法实体的创建被延迟到了工厂子类里,我们不在工厂里直接创建对象,而是直接封装一个一个的小工厂,每个工厂负责创建自己的子类,满足了OCP。
2.工厂方法模式的优点
如果算法种类很多,那么继承抽象工厂的子类也就会很多,不是很好维护,同时不支持产品切换。
抽象工厂模式:
1.抽象工厂模式的优点
首先是满足OCP的,而且可以满足产品切换,能实现的前提是比如A和B两个产品,它们有1和2两个方法接口(类),现在我们在增加新的产品C(假设也是只有1和2两个方法接口),我们要做的只是增加一个产品类再增加一个工厂类就行了,如果是简单工厂或者是工厂方法的的话通常都是增加两个算法类C.1,C.2,简单工厂需要修改switch增加两个语句,工厂方法是在增加两个工厂类,可见抽象工厂的优点。
2.抽象工厂模式的优点
工作量繁杂。
四、代码及结果
简单工厂模式:
ShapeModel接口:
public interface ShapeModel {
void draw();
void erase();
}
Rectangle类(其他两个类似):
public class Rectangle implements ShapeModel{
@Override
public void draw() {
System.out.println("绘制了一个矩形");
}
@Override
public void erase() {
System.out.println("擦除了一个矩形");
}
}
UnsupportedShapeException类:
public class UnsupportedShapeException extends Exception{
public UnsupportedShapeException() {
super();
}
public UnsupportedShapeException(String message) {
super(message);
}
public UnsupportedShapeException(String message, Throwable cause) {
super(message, cause);
}
public UnsupportedShapeException(Throwable cause) {
super(cause);
}
protected UnsupportedShapeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
ShapeFactory类:
public class ShapeFactory {
public ShapeModel CreateShape(String name) throws UnsupportedShapeException{
if (name.equals("圆形")) {
return new Circle();
} else if (name.equals("矩形")) {
return new Rectangle();
} else if (name.equals("三角形")) {
return new Triangle();
}else {
throw new UnsupportedShapeException("不支持绘画该图形");
}
}
public static void main (String args[]) throws UnsupportedShapeException {
ShapeModel model1 ;
ShapeFactory factory1 = new ShapeFactory();
model1 = factory1.CreateShape("圆形");
model1.draw();
model1.erase();
model1 = factory1.CreateShape("矩形");
model1.draw();
model1.erase();
model1 = factory1.CreateShape("三角形");
model1.draw();
model1.erase();
model1 = factory1.CreateShape("1");
}
}
运行结果:
工厂方法模式:
FactoryImageReader接口:
public interface FactoryImageReader {
ImageReader CreatImageReader();
}
ImageReader接口:
public interface ImageReader {
void Reader();
}
GifReader实例(另一个类似):
public class GifReader implements ImageReader{
public void Reader()
{
System.out.println("这是Gif reader");
}
}
JpgReaderFactory实例(另一个类似):
public class JpgReaderFactory implements FactoryImageReader{
public ImageReader CreatImageReader(){
return new JpgReader();
}
}
Test测试类:
public class Test {
public static void main(String args[])
{
FactoryImageReader factory1;
factory1 = new JpgReaderFactory();
ImageReader Reader1 ;
Reader1 = factory1.CreatImageReader();
Reader1.Reader();
factory1 = new GifReaderFactory();
Reader1 = factory1.CreatImageReader();
Reader1.Reader();
}
}
运行结果为:
抽象工厂模式:
AirConditioner接口:
public interface AirConditioner {
void display();
}
Factory接口:
public interface Factory {
television CreateTV();
AirConditioner CreateConditioner();
}
Television接口:
public interface television {
void display();
}
HaierFactory类(另一个类似):
public class HaierFactory implements Factory{
public television CreateTV()
{
return new HaierTv();
}
public AirConditioner CreateConditioner()
{
return new HaierConditioner();
}
}
HaierConditioner类(另一个类似):
public class HaierConditioner implements AirConditioner{
public void display()
{
System.out.println("这是海尔空调");
}
}
HaierTv类(另一个类似):
public class HaierTv implements television{
@Override
public void display() {
System.out.println("这是海尔电视");
}
}
Test类(另一个类似):
public class Test {
public static void main(String args[])
{
Factory factory1 ;
television TV;
AirConditioner conditioner;
factory1 = new HaierFactory();
TV = factory1.CreateTV();
TV.display();
conditioner = factory1.CreateConditioner();
conditioner.display();
factory1 = new TCLFactory();
TV = factory1.CreateTV();
TV.display();
conditioner = factory1.CreateConditioner();
conditioner.display();
}
}
运行结果: