设计模式之四:抽象工厂模式—产品族的创建
2016-09-22 15:26
162 查看
工厂方法模式的问题:
每个工厂只生产一个产品,导致系统中存在大量的工厂类,增加系统的开销,将相同的产品组成一个产品族,由同一个工厂来创建
抽象工厂模式概述:
抽象工厂模式为创建一组对象提供了一种解决方案,于工厂方法模式相比,抽象工厂模式中的具体工厂不止是创建了一种产品,啊负责创建一族产品:提供了一个创建一系列相关或者相互依赖对象接口,而无需制定他们的具体类,抽象工厂模式又称为kit模式,他是一种对象创建型模式。
一、抽象工厂方法模式概述:
abstract class AbstractFactory{
public abstract AbstractFactoryA createOriductA();
public abstract AbstractFactoryB createOriductB();
}
class ConcreteFactory1 extends AbstractFactory{
//工厂方法一
public AbstractFactoryA createProductA(){
return new ConcreteFactoryA1();
}
//工厂方法二
public AbstractFactoryB createProductB(){
return new ConcreteFactoryB1();
}
}
二、完整解决方案:
//按钮借口,抽象产品
interface Button{
public void display();
}
//Spring按钮类:具体产品
class SpringButton implements Button{
public void display(){
System.out.println("显示浅绿色按钮");
}
}
//sunmmer按钮类:具体产品
class SummerButton implements Button{
public void display() {
System.out.println("显示浅蓝色按钮");
}
}
//文本框借口:抽象产品
interface TextField{
public void display();
}
//spring文本框类
class SpringTextField implements TextField{
public void display(){
System.out.println("显示绿色边框文本框");
}
}
//summer文本框类
class SummerTextField implements TextField{
public void display(){
System.out.println("显示蓝色边框文本");
}
}
//组合框借口:抽象产品
interface ComboBox{
public void display();
}
//spring组合框类:具体产品
class SpringComboBox implements ComboBox{
public void display(){
System.out.println("显示绿色组合边框");
}
}
class SummerComboBox implements ComboBox{
public void display(){
System.out.println("显示蓝色边框组合");
}
}
//界面皮肤工厂借口:接口工厂
interface SkinFactory{
public Button createButton();
public TextField createTextField();
public ComboBox createComboBox();
}
//Spring皮肤工厂:具体工厂
class SpringSkinFactory implements SkinFactory{
@Override
public Button createButton() {
return new SpringButton();
}
@Override
public TextField createTextField() {
return new SpringTextField();
}
@Override
public ComboBox createComboBox() {
return new SpringComboBox();
}
}
class SummerSkinFactory implements SkinFactory{
@Override
public Button createButton() {
return new SummerButton();
}
@Override
public TextField createTextField() {
return new SummerTextField();
}
@Override
public ComboBox createComboBox() {
return new SummerComboBox();
}
}
加入XMLUtil有更好的灵活性和可扩展性,加入:
<config>
<className>SpringSkinFactory</className>
</config>
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import java.io.*;
class XMLUtil{
public static String getChartType(){
try{
DocumentBuilderFactory dFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder builer=dFactory.newDocumentBuilder();
Document doc;
doc=builer.parse(new File("config.xml"));
NodeList nl=doc.getElementsByTagName("className");
Node classNode=nl.item(0).getFirstChild();
String cName=classNode.getNodeValue();
Class c=Class.forName(cName);
Object obj=c.newInstance();
return obj;
}
catch(Exception e){
e.printStackTrace();
return null;
}
}
}
public class Client{
public static void main(String[] args) {
SkinFactory factory;
Button bt;
TextField tf;
ComboBox cb;
factory=(SkinFactory)XMLUtil.getBean();
bt=factory.createButton();
tf=factory.createTextField();
cb=factory.createComboBox();
bt.display();
tf.display();
cb.display();
}
}
三、抽象工厂模式总结:
主要优点
隔离了具体类的生成,使得客户并不需要知道什么被创建
当一个产品族中的多个对象呗设计成一起工作时,它能够保证客户短时视同一个产品族中的对象
增加新的产品族很方便,无需修改已有系统,符合开闭原则
主要缺点:
增加新的产品登记结构麻烦,违反了开闭原则
使用场景
无需关心如何被创建
有多余一个产品族
一个产品族在一起使用
产品登记结构稳定
每个工厂只生产一个产品,导致系统中存在大量的工厂类,增加系统的开销,将相同的产品组成一个产品族,由同一个工厂来创建
抽象工厂模式概述:
抽象工厂模式为创建一组对象提供了一种解决方案,于工厂方法模式相比,抽象工厂模式中的具体工厂不止是创建了一种产品,啊负责创建一族产品:提供了一个创建一系列相关或者相互依赖对象接口,而无需制定他们的具体类,抽象工厂模式又称为kit模式,他是一种对象创建型模式。
一、抽象工厂方法模式概述:
abstract class AbstractFactory{
public abstract AbstractFactoryA createOriductA();
public abstract AbstractFactoryB createOriductB();
}
class ConcreteFactory1 extends AbstractFactory{
//工厂方法一
public AbstractFactoryA createProductA(){
return new ConcreteFactoryA1();
}
//工厂方法二
public AbstractFactoryB createProductB(){
return new ConcreteFactoryB1();
}
}
二、完整解决方案:
//按钮借口,抽象产品
interface Button{
public void display();
}
//Spring按钮类:具体产品
class SpringButton implements Button{
public void display(){
System.out.println("显示浅绿色按钮");
}
}
//sunmmer按钮类:具体产品
class SummerButton implements Button{
public void display() {
System.out.println("显示浅蓝色按钮");
}
}
//文本框借口:抽象产品
interface TextField{
public void display();
}
//spring文本框类
class SpringTextField implements TextField{
public void display(){
System.out.println("显示绿色边框文本框");
}
}
//summer文本框类
class SummerTextField implements TextField{
public void display(){
System.out.println("显示蓝色边框文本");
}
}
//组合框借口:抽象产品
interface ComboBox{
public void display();
}
//spring组合框类:具体产品
class SpringComboBox implements ComboBox{
public void display(){
System.out.println("显示绿色组合边框");
}
}
class SummerComboBox implements ComboBox{
public void display(){
System.out.println("显示蓝色边框组合");
}
}
//界面皮肤工厂借口:接口工厂
interface SkinFactory{
public Button createButton();
public TextField createTextField();
public ComboBox createComboBox();
}
//Spring皮肤工厂:具体工厂
class SpringSkinFactory implements SkinFactory{
@Override
public Button createButton() {
return new SpringButton();
}
@Override
public TextField createTextField() {
return new SpringTextField();
}
@Override
public ComboBox createComboBox() {
return new SpringComboBox();
}
}
class SummerSkinFactory implements SkinFactory{
@Override
public Button createButton() {
return new SummerButton();
}
@Override
public TextField createTextField() {
return new SummerTextField();
}
@Override
public ComboBox createComboBox() {
return new SummerComboBox();
}
}
加入XMLUtil有更好的灵活性和可扩展性,加入:
<config>
<className>SpringSkinFactory</className>
</config>
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import java.io.*;
class XMLUtil{
public static String getChartType(){
try{
DocumentBuilderFactory dFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder builer=dFactory.newDocumentBuilder();
Document doc;
doc=builer.parse(new File("config.xml"));
NodeList nl=doc.getElementsByTagName("className");
Node classNode=nl.item(0).getFirstChild();
String cName=classNode.getNodeValue();
Class c=Class.forName(cName);
Object obj=c.newInstance();
return obj;
}
catch(Exception e){
e.printStackTrace();
return null;
}
}
}
public class Client{
public static void main(String[] args) {
SkinFactory factory;
Button bt;
TextField tf;
ComboBox cb;
factory=(SkinFactory)XMLUtil.getBean();
bt=factory.createButton();
tf=factory.createTextField();
cb=factory.createComboBox();
bt.display();
tf.display();
cb.display();
}
}
三、抽象工厂模式总结:
主要优点
隔离了具体类的生成,使得客户并不需要知道什么被创建
当一个产品族中的多个对象呗设计成一起工作时,它能够保证客户短时视同一个产品族中的对象
增加新的产品族很方便,无需修改已有系统,符合开闭原则
主要缺点:
增加新的产品登记结构麻烦,违反了开闭原则
使用场景
无需关心如何被创建
有多余一个产品族
一个产品族在一起使用
产品登记结构稳定
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- 设计模式---状态模式在web前端中的应用
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C# 设计模式系列教程-建造者模式
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- 实例解析C#设计模式编程中简单工厂模式的使用