设计模式-抽象工厂模式实例-01

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 设计模式-抽象工厂模式实例-01,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

设计模式-抽象工厂模式实例-01

要点:

需要一个工厂生产多个产品对象。

优点:

隔离了具体类的生成,使客户端不知道什么被创建;

保证客户端始终只使用一个产品族的对象;

增加新的产品族很方便,符合开闭原则。

缺点:

增加新的产品等级结构很复杂,不符合开闭原则。

适用环境:

一个系统不应当依赖于产品类的实例如何被创建、组合和表达的细节;

系统中有多个产品族但每次只使用其中某一产品族;

属于同一个产品族的产品将在一起被使用;

产品等级结构稳定。

静态工厂模式、工厂方法模式、抽象工厂模式对比:

设计模式-抽象工厂模式实例-01

设计模式-抽象工厂模式实例-01

设计模式-抽象工厂模式实例-01

实例1:海尔工厂和TCL工厂生产电视和空调。

类图

设计模式-抽象工厂模式实例-01

代码实现:

代码结构:

设计模式-抽象工厂模式实例-01

factory:

EFactory.java:

import abstractTVFactory.airConditioner.AirConditioner;
import abstractTVFactory.television.Television;

//抽象工厂类
public interface EFactory {
    public Television produceTelevision();
    public AirConditioner produceAirConditioner();
}

HaierFactory.java:

import abstractTVFactory.airConditioner.AirConditioner;
import abstractTVFactory.airConditioner.HaierAirConditioner;
import abstractTVFactory.television.HaierTelevision;
import abstractTVFactory.television.Television;

//具体工厂类HaierFactory
public class HaierFactory implements EFactory {
    public Television produceTelevision(){
        return new HaierTelevision();
    }
    public AirConditioner produceAirConditioner(){
        return new HaierAirConditioner();
    }
}

TCLFactory.java:

import abstractTVFactory.airConditioner.AirConditioner;
import abstractTVFactory.airConditioner.TCLAirConditioner;
import abstractTVFactory.television.TCLTelevision;
import abstractTVFactory.television.Television;

//具体工厂类TCLFactory
public class TCLFactory implements EFactory {
    public Television produceTelevision(){
        return new TCLTelevision();
    }
    public AirConditioner produceAirConditioner(){
        return new TCLAirConditioner();
    }
}

television:

Television.java:

//抽象产品类
public interface Television {
    public void play();
}

HaierTelevision.java:

//具体产品类HaierTV
public class HaierTelevision implements Television {
    public void play(){
        System.out.println("Haier TV is playing");
    }
}

TCLTelevision.java:

//具体产品类TCLTV
public class TCLTelevision implements Television {
    public void play(){
        System.out.println("TCL TV is playing");
    }
}

airConditioner:

AirConditioner.java:

//抽象工厂类AirConditioner
public interface AirConditioner {
    public void use();
}

HaierAirConditioner.java:

//具体产品类Haier空调
public class HaierAirConditioner implements AirConditioner {
    public void use(){
        System.out.println("Haier AirConditioner is using");
    }
}

TCLAirConditioner.java:

//具体产品类TCL空调
public class TCLAirConditioner implements AirConditioner {
    public void use(){
        System.out.println("TCL AirConditioner is using");
    }
}

utils:

XMLUtil.java:

import org.w3c.dom.*;
import javax.xml.parsers.*;
import org.xml.sax.SAXException;
import java.io.*;

public class XMLUtil {
    public static Object getBean(){
        try {
            //创建文档对象
            DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = dFactory.newDocumentBuilder();
            Document doc;
            doc = builder.parse(new File("src/abstractTVFactory/utils/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;
        }
    }
}

config.xml:

<?xml version="1.0"  ?>
<config>
    <className>abstractTVFactory.factory.TCLFactory</className>
</config>

Client:

Client.java:

import abstractTVFactory.airConditioner.AirConditioner;
import abstractTVFactory.factory.EFactory;
import abstractTVFactory.television.Television;
import abstractTVFactory.utils.XMLUtil;

public class Client {
    public static void main(String[] args) {
        try{
            EFactory factory;
            Television tv;
            AirConditioner airConditioner;
            factory = (EFactory) XMLUtil.getBean();
            tv = factory.produceTelevision();
            tv.play();

            airConditioner = factory.produceAirConditioner();
            airConditioner.use();

        }catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
}

 运行结果:

设计模式-抽象工厂模式实例-01

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/128224.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!