写点什么

设计模式——工厂模式

  • 2021 年 11 月 12 日
  • 本文字数:2917 字

    阅读完需:约 10 分钟

public class JpgReader implements Reader {


@Override


public void read() {


System.out.print("read jpg");


}


}


Png 图片加载器类:PngReader.java


public class PngReader implements Reader {


@Override


public void read() {


System.out.print("read png");


}


}


Png 图片加载器类:GifReader.java


public class GifReader implements Reader {


@Override


public void read() {


System.out.print("read gif");


}


}


定义一个抽象的工厂接口:ReaderFactory.java


public interface ReaderFactory {


Reader getReader();


}


里面有一个 getReader()方法返回我们的 Reader 类,接下来我们把上面定义好的每个图片加载器都提供一个工厂类,这些工厂类实现了 ReaderFactory 。


Jpg 加载器工厂:JpgReaderFactory.java


public class JpgReaderFactory implements ReaderFactory {


@Override


public Reader getReader() {


return new JpgReader();


}


}


Png 加载器工厂:GifReaderFactory.java


public class PngReaderFactory implements ReaderFactory {


@Override


public Reader getReader() {


return new PngReader();


}


}


Gif 加载器工厂:GifReaderFactory.java


public class GifReaderFactory implements ReaderFactory {


@Override


public Reader getReader() {


return new GifReader();


}


}


测试类:Main.java


public class Main {


public static void main(String[] args) throws Exception {


//Jpg


ReaderFactory factory1=new JpgReaderFactory();


Reader reader1=factory1.getReader();


reader1.read();


//Png


ReaderFactory factory2=new PngReaderFactory();


Reader reader2=factory2.getReader();


reader2.read();


//Gif


ReaderFactory factory3=new GifReaderFactory();


Reader reader3=factory3.getReader();


reader3.read();


}


}


可以看到上面三段代码,分别读取了不同格式的图片,不同之处在于针对不同的图片格式声明了不同的工厂,进而创建了相应的图片加载器。


通过这个实例各位小伙伴是不是对工厂模式有了进一步的理解呢,和简单工厂对比一下,最根本的区别在于,简单工厂只有一个统一的工厂类,而工厂方法是针对每个要创建的对象都会提供一个工厂类,这些工厂类都实现了一个工厂基类(本例中的 ReaderFactory )。

抽象工厂模式

定义:


提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。( 在抽象工厂模式中,每一个具体工厂都提供了多个工厂方法用于产生多种不同类型的对象)


这个模式最不好理解,而且在实际应用中局限性也蛮大的,因为这个模式并不符合开闭原则。实际开发还需要做好权衡。


抽象工厂模式是工厂方法的仅一步深化,在这个模式中的工厂类不单单可以创建一个对象,而是可以创建一组对象。这是和工厂方法最大的不同点。


提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。( 在抽象工厂模式中,每一个具体工厂都提供了多个工厂方法用于产生多种不同类型的对象)


抽象工厂和工厂方法一样可以划分为 4 大部分:


AbstractFactory(抽象工厂)声明了一组用于创建对象的方法,注意是一组。


ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建对象的方法,生成一组具体对象。


AbstractProduct(抽象产品):它为每种对象声明接口,在其中声明了对象所具有的业务方法。


ConcreteProduct(具体产品):它定义具体工厂生产的具体对象。


实例:


现在需要做一款跨平台的游戏,需要兼容 Android,Ios,Wp 三个移动操作系统,该游戏针对每个系统都设计了一套操作控制器(OperationController)和界面控制器(UIController),下面通过抽闲工厂方式完成这款游戏的架构设计。


抽象操作控制器接口:OperationController.java


public interface OperationController {


void control();


}


抽象界面控制器接口:UIController.java


public interface UIController {


void display();


}


然后完成各个系统平台的具体操作控制器和界面控制器


Android:


AndroidOperationController.java


public class AndroidOperationController implements OperationController {


@Override


public void control() {


System.out.println("AndroidOperationController");


}


}


AndroidUIController.java


public class AndroidUIController implements UIController {


@Override


public void display() {


System.out.println("AndroidInterfaceController");


}


}


Ios:


IosOperationController.java


public class IosOperationController implements OperationController {


@Override


public void control() {


System.out.println("IosOperationController");


}


}


IosUIController.java


public class IosUIController implements UIController {


@Override


public void display() {


System.out.println("IosInterfaceController");


}


}


Wp:


WpOperationController.java


public class WpOperationController implements OperationController {


@Override


public void control() {


System.out.println("WpOperationController");


}


}


WpUIController.java


public class WpUIController implements UIController {


@Override


public void display() {


System.out.println("WpInterfaceController");


}


}


下面定义一个抽闲工厂,该工厂需要可以创建 OperationController 和 UIController


SystemFactory.jaava


public interface SystemFactory {


public OperationController createOperationController();


public UIController createInterfaceController();


}


在各平台具体的工厂类中完成操作控制器和界面控制器的创建过程


Android:


AndroidFactory.java


public class AndroidFactory implements SystemFactory {


@Override


public OperationController createOperationController() {


return new AndroidOperationController();


}


@Override


public UIController createInterfaceController() {


return new AndroidUIController();


}


}


Ios:


IosFactory.java


public class IosFactory implements SystemFactory {


@Override


public OperationController createOperationController() {


return new IosOperationController();


}


@Override


public UIController createInterfaceController() {


return new IosUIController();


}


}


Wp:


WpFactory.java


public class WpFactory impleme


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


nts SystemFactory {


@Override


public OperationController createOperationController() {


return new WpOperationController();


}


@Override


public UIController createInterfaceController() {


return new WpUIController();


}


}


测试类:Main.java


public class Main {


public static void main(String[] args) throws Exception {


SystemFactory mFactory;


UIController interfaceController;


OperationController operationController;


//Android


mFactory=new AndroidFactory();


//Ios


mFactory=new IosFactory();


//Wp


mFactory=new WpFactory();


interfaceController=mFactory.createInterfaceController();


operationController=mFactory.createOperationController();


interfaceController.display();


operationController.control();}}

评论

发布
暂无评论
设计模式——工厂模式