提供一个接口以提供一系列相关或相互依赖的对象,而无须知道指定它们的具体的类java
Kitapp
抽象工厂具备如下优势和缺点:ide
1) 分离了具体的类 客户经过它们的抽象对象接口操纵实例。产品的类名也在具体工厂的实现中被隔离,即它们不出如今客户代码中ui
2) 易于交换产品系列 抽象工厂建立了完整的产品系列,只须要改变具体工厂便可使用不一样产品的配置spa
3) 利于产品的统一性 当一个系列中的产品对象被设计成一块儿工做时,一个应用一次只能使用同一系列中的对象设计
4) 难以支持新种类的产品 抽象工厂接口肯定了能够被建立的产品集合。支持新种类的产品就须要扩展该工厂接口,这将设计抽象工厂类及其子类的改变code
buttons: 第一个产品层次结构 orm
Button.javaxml
package abstract_factory; /** * @author GaoMing * @date 2021/7/17 - 15:37 * */ public interface Button { void paint(); }
MacOSButton.java对象
package abstract_factory;
/**
* @author GaoMing
* @date 2021/7/17 - 15:38
*/
public class MacOSButton implements Button{
@Override
public void paint(){
System.out.println("You have created MacOSButton.");
}
}
WindowsButton.java
package abstract_factory; /** * @author GaoMing * @date 2021/7/17 - 15:39 */ public class WindowsButton implements Button{ @Override public void paint(){ System.out.println("You have created WindowButton."); } }
Checkbox: 第二个产品结构
Checkbox.java
package abstract_factory; /** * @author GaoMing * @date 2021/7/17 - 15:40 */ public interface Checkbox { void paint(); }
MacOSCheckbox.java
package abstract_factory; /** * @author GaoMing * @date 2021/7/17 - 15:41 */ public class MacOSCheckbox implements Checkbox{ @Override public void paint(){ System.out.println("You have created MacOSCheckbox."); } }
WindowsCheckbox.java
package abstract_factory;
/**
* @author GaoMing
* @date 2021/7/17 - 15:42
*/
public class WindowsCheckbox implements Checkbox{
@Override
public void paint(){
System.out.println("You have created WindowCheckbox.");
}
}
Factories
GUIFactories.java: 抽象工厂
package abstract_factory.factories; import abstract_factory.Button; import abstract_factory.Checkbox; /** * @author GaoMing * @date 2021/7/17 - 15:43 */ public interface GUIFactory { Button createButton(); Checkbox createCheckbox(); }
MacOSFactory.java: 具体工厂 ( macOS)
package abstract_factory.factories; import abstract_factory.Button; import abstract_factory.Checkbox; import abstract_factory.MacOSButton; import abstract_factory.MacOSCheckbox; /** * @author GaoMing * @date 2021/7/17 - 15:46 */ public class MacOSFactory implements GUIFactory{ @Override public Button createButton(){ return new MacOSButton(); } @Override public Checkbox createCheckbox(){ return new MacOSCheckbox(); } }
WindowsFactory.java: 具体工厂 (Windows)
package abstract_factory.factories; import abstract_factory.Button; import abstract_factory.Checkbox; import abstract_factory.WindowsButton; import abstract_factory.WindowsCheckbox; /** * @author GaoMing * @date 2021/7/17 - 15:49 */ public class WindowsFactory implements GUIFactory{ @Override public Button createButton(){ return new WindowsButton(); } @Override public Checkbox createCheckbox(){ return new WindowsCheckbox(); } }
Application.java: 客户端代码
package abstract_factory; import abstract_factory.Button; import abstract_factory.Checkbox; import abstract_factory.factories.GUIFactory; /** * @author GaoMing * @date 2021/7/17 - 15:52 */ public class Application { private Button button; private Checkbox checkbox; public Application(GUIFactory factory){ button = factory.createButton(); checkbox = factory.createCheckbox(); } public void paint(){ button.paint(); checkbox.paint(); } }
Demo.java: 程序配置
package abstract_factory; import abstract_factory.factories.GUIFactory; import abstract_factory.factories.MacOSFactory; import abstract_factory.factories.WindowsFactory; import abstract_factory.Application; import java.util.Locale; /** * @author GaoMing * @date 2021/7/17 - 15:57 */ public class Demo { private static Application configureApplication(){ Application app; GUIFactory factory; String osName = System.getProperty("os.name").toLowerCase(); if(osName.contains("mac")){ factory = new MacOSFactory(); app = new Application(factory); }else{ factory = new WindowsFactory(); app = new Application(factory); } return app; } public static void main(String[] args){ Application app = configureApplication(); app.paint(); } }
运行结果
You create WindowsButton.
You created WindowsCheckbox.
javax.xml.parsers.DocumentBuilderFactory#newInstance()
javax.xml.transform.TransformerFactory#newInstance()
javax.xml.xpath.XPathFactory#newInstance()