引言
抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。
我们这时候要清楚一件事情那就是所有我们得产品多将有着对应的接口以便产出不同的产品
这个模式在Java中非常常见
javax.xml.parsers.DocumentBuilderFactory#newInstance()
javax.xml.transform.TransformerFactory#newInstance()
javax.xml.xpath.XPathFactory#newInstance()
案例 控件
需求
我现在需要一些button以及checkbox,但是有着不同的结构,简单就是有windows以及mac
分工
button以及checkbox接口(定义产品) 总抽象工厂(产品接口工厂) Application(创建产品对象)
代码
AbstractFactory:抽象工厂
Applicaiton:应用类
Button:按钮接口
CheckBox:选择框接口
Client:调用者
MacButton:Mac类型的Button接口实现
MacCheckBox:Mac类型的CheckBox接口实现
MacFactory:Mac类型的工厂类
WindowButton:Window类型的Button接口实现
WindowCheckBox:Window类型的CheckBox接口实现
WindowFactory:Window类型的工厂类
AbstractFactory
public interface AbstractFactory {
Button createButton();
CheckBox createCheckBox();
}
Application
public class Application {
private Button button;
private CheckBox checkBox;
public Application(AbstractFactory factory){
button = factory.createButton();
checkBox = factory.createCheckBox();
}
public void paint(){
button.paint();
checkBox.paint();
}
}
Button
public interface Button {
void paint();
}
CheckBox
public interface CheckBox {
void paint();
}
MacButton
public class MacButton implements Button {
@Override
public void paint() {
System.out.println("这是mac按钮");
}
}
MacCheckBox
public class MacCheckBox implements CheckBox {
@Override
public void paint() {
System.out.println("这是mac check box");
}
}
MacFactory
public class MacFactory implements AbstractFactory {
@Override
public Button createButton() {
return new MacButton();
}
@Override
public CheckBox createCheckBox() {
return new MacCheckBox();
}
}
WindowsButton
public class WindowsButton implements Button {
@Override
public void paint() {
System.out.println("这是windows按钮");
}
}
WindowsCheckBox
public class WindowsCheckBox implements CheckBox {
@Override
public void paint() {
System.out.println("这是windows check box");
}
}
WindowsFactory
public class WindowsFactory implements AbstractFactory {
@Override
public Button createButton() {
return new WindowsButton();
}
@Override
public CheckBox createCheckBox() {
return new WindowsCheckBox();
}
}
Client
public class Client {
public static void main(String[] args) {
Application application = configureApplication();
application.paint();
}
public static Application configureApplication() {
Application app;
AbstractFactory factory;
String osName = System.getProperty("os.name").toLowerCase();
System.out.println(osName);
if ("mac".equals(osName)) {
factory = new MacFactory();
app = new Application(factory);
} else {
factory = new WindowsFactory();
app = new Application(factory);
}
return app;
}
}
到这里我们可以得到运行结果
结束语
抽象工厂模式带给我们的思想就是当我们的产品比较多时候,多意思就是说不仅仅值得类型多而且此类型下还有一起其他分支,这样的话使用抽象工厂模式最合适不过,你不用再去挨个创建对象,并且也可以结果多并且容易扩展的好处