设计模式——工厂模式
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
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();}}
评论