23种经典设计模式的java实现_1_抽象工厂模式

简介:
抽象工厂模式的适用:
一个系统要独立于它的产品的创建、组合和表示时。
一个系统要由多个产品系列中的一个来配置时。
当你要强调一系列相关的产品对象的设计以便进行联合使用时。 
当你提供一个产品类库,而只想显示它们的接口而不是实现时。
示例说明:
有三种抽象的产品:墙、门、房间。
对这三种抽象产品有两组具体实现:卧室和起居室。
那么,我们的抽象工厂就可以根据客户的指令(即调用参数)去生产卧室和起居室的房间(墙和门包括在房间里)。
测试启动类:
package com.alex.designpattern.abstractfactory;
/** *//**
 * 抽象工厂模式
 * <p>
 * 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
 * 
 * @author <a href=" huqimailto:huqiyes@gmail.com">huqi</a>
 * @serialData 2007
 */
public class Test ...{
    public static void main(String[] args) throws Exception ...{
        // ----- Create Living Room
        Room myLivingRoom = AbstractRoomFactory.createRoom("LivingRoom");
        AbstractRoomFactory.showRoom(myLivingRoom);
        // ----- Create Bed Room
        Room myBedRoom = AbstractRoomFactory.createRoom("BedRoom");
        AbstractRoomFactory.showRoom(myBedRoom);
    }
}
抽象产品:
package com.alex.designpattern.abstractfactory;
/** *//**
 * The Abstract Class of Wall
 */
public interface Wall ...{
    public String getName();
}
package com.alex.designpattern.abstractfactory;
/** *//**
 * The Abstract Class of Door
 */
public interface Door ...{
    public String getName();
}
package com.alex.designpattern.abstractfactory;
/** *//**
 * The Abstract Class of Room
 */
public interface Room ...{
    public Wall getWall();
    public Door getDoor();
}
实际产品_1
package com.alex.designpattern.abstractfactory;
/** *//**
 * A concrete Room - Bed Room
 */
public class BedRoom implements Room ...{
    public BedRoom() ...{
        System.out.println("Initiated a bedroom.");
    }
    public Door getDoor() ...{
        return new BedRoomDoor();
    }
    public Wall getWall() ...{
        return new BedRoomWall();
    }
}
package com.alex.designpattern.abstractfactory;
/** *//**
 * A concrete Door for Bed Room
 */
public class BedRoomDoor implements Door ...{
    private String doorName;
    public BedRoomDoor() ...{
        doorName = "BedRoomDoor";
    }
    public String getName() ...{
        return doorName;
    }
}
package com.alex.designpattern.abstractfactory;
/** *//**
 * A concrete Wall for Bed Room
 */
public class BedRoomWall implements Wall ...{
    private String wallName;
    public BedRoomWall() ...{
        wallName = "BedRoomWall";
    }
    public String getName() ...{
        return wallName;
    }
}
实际产品_2
package com.alex.designpattern.abstractfactory;
/** *//**
 * A concrete Room - Living Room
 */
public class LivingRoom implements Room ...{
    public LivingRoom() ...{
        System.out.println("Initiated a livingroom.");
    }
    public Door getDoor() ...{
        return new LivingRoomDoor();
    }
    public Wall getWall() ...{
        return new LivingRoomWall();
    }
}
package com.alex.designpattern.abstractfactory;
/** *//**
 * A concrete Door for Living Room
 */
public class LivingRoomDoor implements Door ...{
    private String doorName;
    public LivingRoomDoor() ...{
        doorName = "LivingRoomDoor";
    }
    public String getName() ...{
        return doorName;
    }
}
package com.alex.designpattern.abstractfactory;
/** *//**
 * A concrete Wall for Living Room
 */
public class LivingRoomWall implements Wall ...{
    private String wallName;
    public LivingRoomWall() ...{
        wallName = "LivingRoomWall";
    }
    public String getName() ...{
        return wallName;
    }
}
最后,当然就是抽象工厂咯,不过要注意,这个抽象工厂的意思并不是这个“工厂”是抽象的,而是这个“工厂”加工的“产品”是来自于抽象的。
package com.alex.designpattern.abstractfactory;
/** *//**
 * A Room Maker to test our simple Room Abstract Factory.
 * 
 * @author <a href=" huqimailto:huqiyes@gmail.com">huqi</a>
 * @serialData 2007
 */
public abstract class AbstractRoomFactory ...{
    public static Room createRoom(String roomType) throws Exception ...{
        if (roomType.equals("LivingRoom")) ...{
            return new LivingRoom();
        } else if (roomType.equals("BedRoom")) ...{
            return new BedRoom();
        } else ...{
            throw new Exception("No this type room: " + roomType);
        }
    }
    public static void showRoom(Room room) ...{
        Door door = room.getDoor();
        System.out.println("Room door name is: " + door.getName());
        Wall wall = room.getWall();
        System.out.println("Room wall name is: " + wall.getName());
    }
}
 


     本文转自胡奇 51CTO博客,原文链接:http://blog.51cto.com/huqicto/280900,如需转载请自行联系原作者



相关文章
|
5月前
|
设计模式 Java 关系型数据库
【设计模式】【创建型模式】抽象工厂模式(Abstract Factory)
一、入门 什么是抽象工厂模式? 抽象工厂模式是一种创建型设计模式,它提供了一个接口,用于创建相关或依赖对象的家族,而不需要指定具体的类。 简单来说,抽象工厂模式是工厂方法模式的升级版,它能够创建一组相
169 14
|
5月前
|
设计模式 缓存 安全
【高薪程序员必看】万字长文拆解Java并发编程!(8):设计模式-享元模式设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的经典对象复用设计模式-享元模式,废话不多说让我们直接开始。
111 0
|
7月前
|
设计模式 Java 数据安全/隐私保护
Java 设计模式:装饰者模式(Decorator Pattern)
装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式。该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭)。
|
9月前
|
设计模式
「全网最细 + 实战源码案例」设计模式——抽象工厂模式
抽象工厂模式是一种创建型设计模式,提供接口用于创建一系列相关或依赖的对象,无需指定具体类。它解决了产品族问题,管理和创建一组相关产品。结构上包括抽象工厂、具体工厂、抽象产品和具体产品。适用于创建相关对象、产品族固定但种类变化的场景。优点是分离接口与实现、管理产品族方便且扩展性好;缺点是产品族扩展困难且代码复杂度增加。通过配置文件和反射机制可进一步改进,使系统更灵活易扩展。
161 17
|
11月前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
175 6
|
11月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
144 4
|
11月前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
488 0
|
设计模式 缓存 安全
Java设计模式的单例模式应用场景
Java设计模式的单例模式应用场景
222 4
|
设计模式 安全 Java
Java 编程中的设计模式:单例模式的深度解析
【9月更文挑战第22天】在Java的世界里,单例模式就像是一位老练的舞者,轻盈地穿梭在对象创建的舞台上。它确保了一个类仅有一个实例,并提供全局访问点。这不仅仅是代码优雅的体现,更是资源管理的高手。我们将一起探索单例模式的奥秘,从基础实现到高级应用,再到它与现代Java版本的舞蹈,让我们揭开单例模式的面纱,一探究竟。
106 11

热门文章

最新文章