十、抽象工厂模式

第五篇写了关于简单工厂模式,链接地址:http://www.cnblogs.com/lay2017/p/7573805.html

但是我们的项目有时候简单工厂并不能满足,可能需要多个简单工厂,那么这时候如果我们用一个超级工厂来管理这些简单工厂是不是可以呢?这就是抽象工厂模式,如图:

抽象工厂模式能够帮助我们解决接口选择的问题,提供一个清晰的入口。具体代码如下:

/**
 * 抽象工厂
 * @author lay
 */
public class SuperFactoryDemo {
    public static void main(String[] args) {

        SuperFactory superFactory = FactoryProducer.getFactory("fire");
        FireParent fireParent = superFactory.getFire("fireChild1");
        fireParent.doSth();

        superFactory = FactoryProducer.getFactory("sunshine");
        SunshineParent sunshineParent = superFactory.getSunshine("sunshineChild1");
        sunshineParent.doSth();
    }
}

// 提供获取工厂的方法
class FactoryProducer{

    public static SuperFactory getFactory(String factoryName){
        SuperFactory superFactory = null;
        switch (factoryName) {
            case "fire":
                superFactory =  new FireFactory();
                break;
            case "sunshine":
                superFactory =  new SunshineFactory();
                break;
            default:
                break;
        }
        return superFactory;
    }
}

// 建立超级工厂
interface SuperFactory{
    public FireParent getFire(String firename);
    public SunshineParent getSunshine(String sunshineName);
}

// 建立第一个简单工厂
class FireFactory implements SuperFactory{

    public FireParent getFire(String fireName){
        FireParent fireParent = null;
        switch (fireName) {
            case "fireChild1":
                fireParent = new FireChild1();
                break;
            case "fireChild2":
                fireParent = new FireChild2();
                break;
            default:
                break;
        }
        return fireParent;
    }

    @Override
    public SunshineParent getSunshine(String sunshineName) {
        return null;
    }
}

interface FireParent{
    public void doSth();
}

class FireChild1 implements FireParent{

    @Override
    public void doSth() {
        System.out.println("fire child 1");
    }

}

class FireChild2 implements FireParent{

    @Override
    public void doSth() {
        System.out.println("fire child 2");
    }

}

// 建立第二个工厂
class SunshineFactory implements SuperFactory{

    public SunshineParent getSunshine(String sunshineName){
        SunshineParent sunshineParent = null;
        switch (sunshineName) {
            case "sunshineChild1":
                sunshineParent = new SunshineChild1();
                break;
            case "sunshineChild2":
                sunshineParent = new SunshineChild2();
                break;
            default:
                break;
        }
        return sunshineParent;
    }

    @Override
    public FireParent getFire(String firename) {
        return null;
    }
}

interface SunshineParent{
    public void doSth();
}

class SunshineChild1 implements SunshineParent{

    @Override
    public void doSth() {
        System.out.println("sunshine child 1");
    }

}

class SunshineChild2 implements SunshineParent{

    @Override
    public void doSth() {
        System.out.println("sunshine child 2");
    }

}

抽象工厂很好地组织了对象的创建,但问题也是很明显的,由于它是多个工厂的结合,所以当这个超级工厂非常大的时候,改动起来就会很不方便,你不仅需要改动具体的业务内容,你还要改动工厂。

时间: 2024-12-15 06:34:34

十、抽象工厂模式的相关文章

二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Message有一个Insert()方法,该方法的参数是MessageModel. AbstractMessageModel using System; using System.Collections.Generic; using System.Text; namespace Pattern.Abstract

C#之三十九 抽象工厂模式

在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种"封装机制"来避免客户程序和这种"多系列具体对象创建工作"的紧耦合?这就是我们要说的抽象工厂模式. 重点: ?      抽象工厂模式概念 ?      抽象工厂模式的模型图 ?      抽象工厂模式访问多种数据库 预习功课: ?      什么是抽象工厂模式 ?  

设计模式之_简单工厂模式、工厂方法模式、抽象工厂模式 、策略模式、策略与工厂的区别(转)

一.前言 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上 Audi后他说“开奥迪车!”.你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的 幸运的是这种有病的现象在OO语言中可以避免了.下面以Java语言为基础来引入我们本文的主题:工厂模式! 二.简介

工厂方法模式与抽象工厂模式

本文转自:http://laughingchs.iteye.com/blog/1169986 一.引子       话说十年前,有一个暴发户,他家有三辆汽车——Benz奔驰.Bmw宝马.Audi奥迪,还雇了司机为他开车.不过,暴发户坐车时总是怪怪的:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上Audi说“开奥迪车!”.你一定说:这人有病!直接说开车不就行了?!       而当把这个暴发户的行为放到我们程序设计中来时,会发现这是一个普遍存在的现象.幸运的是,这种有病

简单工厂、工厂方法模式、抽象工厂模式

只为每天积累一点点... 简单工厂.工厂方法模式.抽象工厂模式的简单原理. 一.引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上 Audi后他说“开奥迪车!”.你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的!幸运的是这种有病的现象在OO语言中可

抽象工厂模式

思考:工厂方法模式:http://www.cnblogs.com/maggiejyt/p/7561253.html 工厂方法模式UML: 问题:如果这家工厂不止要生产Ball(球),还要还有Sneakers(球鞋)等 则UML图为 当Product有多种类时则是抽象工厂模式 代码(Ball的代码见简单工厂模式:http://www.cnblogs.com/maggiejyt/p/7561253.html) Sneakers(球鞋抽象类) package com.maggie.FactoryMet

Java设计模式—工厂方法模式&抽象工厂模式

工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式.       工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义:Creator为抽象创建 类,也就是抽象工厂,具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的. 工厂方法模式的扩展方式有很多种,下边是工厂方法模式一个比较实用的源代码: 抽象产品类: pub

大话设计模式:抽象工厂模式

抽象方法模式:提供一个创建一系列相关或互相依赖对象的接口,而无需指定他们具体的类. 三种模式的对比:   简单工厂模式 工厂模式 抽象工厂模式 产品 可以有多个但是都属于同一类, 同一等级.都继承产品抽象类. 可以有多个但是都属于同一类,同一等级. 都继承产品抽象类. 可以有不同种类的产品,每类有多中 具体产品: 抽象产品 只能有一个 只能有一个; 多个抽象产品类:每个抽象产品类可 以派生多种具体产品: 抽象工厂类   只能有一个,可以派生出多个具体工厂类: 只有一个,可派生出多个具体工厂类:

【设计模式】1、抽象工厂模式

对于这个抽象工厂的相应的代码实现 /** * 功能:抽象工厂模式的作用 适用性 1.一个系统要独立于它的产品的创建.组合和表示时. 2.一个系统要由多个产品系列中的一个来配置时. 3.当你要强调一系列相关的产品对象的设计以便进行联合使用时. 4.当你提供一个产品类库,而只想显示它们的接口而不是实现时. * 时间:2016年2月11日22:18 * 作者:cutter_point */ package com.shejimoshi.create.AbstractFactory; public in