抽象工厂模式

思考:工厂方法模式: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.FactoryMethod;

public  abstract  class Sneakers {
     private String name;

    public Sneakers(String name) {
         super ();
         this .name = name;
    }

    public Sneakers() {
         super ();
    }

    public String getName() {
         return name;
    }

    public  void setName(String name) {
         this .name = name;
    }

    public  abstract  void show();

}

FootSneakers(足球鞋)

package com.maggie.FactoryMethod;

public  class FootSneakers extends Sneakers {

    @Override
    public  void show() {
        String show = "the sneakers is " + this .getName();
        System.out.println(show);

    }

    public FootSneakers() {
         super ();
    }

    public FootSneakers(String name) {
         super (name);
    }

}

BasketSneakers(篮球鞋)

package com.maggie.FactoryMethod;

public  class BasketSneakers extends Sneakers {

    @Override
    public  void show() {
        String show = "the sneakers is "+ this .getName();
        System.out.println(show);
    }
    public BasketSneakers() {
        super();
    }

    public BasketSneakers(String name) {
        super(name);
    }
}

IFactory(工厂接口)

package com.maggie.FactoryMethod;

public interface IFactory {
public abstract Ball createBall();
public abstract Sneakers createSneakers();
}

FootSneakers(足球工厂)

package com.maggie.FactoryMethod;

public class FootSneakers extends Sneakers {

    @Override
    public void show() {
        String show = "the sneakers is " + this.getName();
        System.out.println(show);

    }

    public FootSneakers() {
        super();
    }

    public FootSneakers(String name) {
        super(name);
    }

}

BasketFactory(篮球工厂)

package com.maggie.FactoryMethod;

public class BasketFactory implements IFactory {

    @Override
    public Ball createBall() {
        // TODO Auto-generated method stub
        return new BasketBall("oranger");
    }

    @Override
    public Sneakers createSneakers() {
        return new BasketSneakers("basketball sneakers");
    }

}

客户端调用

package com.maggie.FactoryMethod;

public class Client {

    public static void main(String[] args) {
        IFactory iFactory = null;

        iFactory = new FootFactory();
        Ball footBall = iFactory.createBall();
        Sneakers footSneakers = iFactory.createSneakers();
        footBall.play();
        footSneakers.show();

        iFactory = new BasketFactory();
        Ball basketBall = iFactory.createBall();
        Sneakers basketSneakers = iFactory.createSneakers();
        basketBall.play();
        basketSneakers.show();

    }

}

结果输出:

the ball‘s color is white+black,I am FootBall
the sneakers is football sneakers
the ball‘s color is oranger,I am BasketBall
the sneakers is basketball sneakers

思考:

每次增加一种产品类,就要改动各种Factory的代码。。。。。

采用的是用简单工厂来改进抽象工厂

代码实现

SportsEquipmentFactory(采用简单工厂模式来改进)

package com.maggie.FactoryMethod;

public class SportsEquipmentFactory {
    private static final String STYLE = "basket";
    // private static final String STYLE="foot";只需要更改这里的代码配置

    public static Ball createBall() {
        Ball ball = null;
        switch (STYLE) {
        case "basket":
            ball = new BasketBall("oranger");
            break;
        case "foot":
            ball = new FootBall("white+black");
            break;
        }
        return ball;
    }

    public static Sneakers createSneakers() {
        Sneakers sneakers = null;
        switch (STYLE) {
        case "basket":
            sneakers = new BasketSneakers("basketball sneakers");
            break;
        case "foot":
            sneakers = new FootSneakers("football sneakers");
            break;
        }
        return sneakers;
    }
}

客户端调用

package com.maggie.FactoryMethod;

public class Client {

    public static void main(String[] args) {
        Ball ball = SportsEquipmentFactory.createBall();
        ball.play();
        Sneakers sneakers = SportsEquipmentFactory.createSneakers();
        sneakers.show();

    }

}

输出

the ball‘s color is oranger,I am BasketBall
the sneakers is basketball sneakers

思考:如果业务又做大,工厂又需要生产网球类的产品,则需要在SportsEquipmentFactory的switch中增加case,这又违反了开放-封闭原则

这时就要考虑反射。。。。

时间: 2024-12-28 00:53:48

抽象工厂模式的相关文章

抽象工厂模式(Abstract Factory)C#实例

抽象工厂模式(Abstract Factory)C#实例 本文出处http://www.dofactory.com/net/abstract-factory-design-pattern 一.场景描述 本实例描述了抽象工厂模式的一个使用场景.在动物世界弱肉强食,食肉动物会吃掉食草动物.这是动物世界的规律,因此在动物世界类中有Runfoodchain(运行食物链)方法.在动物世界里总是有食肉动物和食草动物这两个抽象成员.它们之所以是抽象成员是因为他们不是具体的一种动物.而食草动物与食肉动物的区别在

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

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

设计模式 - 抽象工厂模式(abstract factory pattern) 详解

抽象工厂模式(abstract factory pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27091671 参考工厂模式: http://blog.csdn.net/caroline_wendy/article/details/27081511 抽象工厂模式: 提供一个接口, 用于创建相关或依赖对象的家族, 而不需要明确指定具体类. 全部代码: http://download.csdn.net/de

设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释

抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27091671 參考工厂模式: http://blog.csdn.net/caroline_wendy/article/details/27081511 抽象工厂模式: 提供一个接口, 用于创建相关或依赖对象的家族, 而不须要明白指定详细类. 所有代码: http://download.csdn.net/

Android设计模式——抽象工厂模式(Abstract Factory)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 package com.example.main; 2 3 import android.app.Activity; 4 import

php设计模式——抽象工厂模式(Abstract Factory)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 <?php 2 /* 3 * php设计模式——抽象工厂模式(Abstract Factory) 4 */ 5 6 7 /* 8 * I

抽象工厂模式&lt;Abstract Factory&gt;

概述 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.让子类决定实例化哪一个类 角色 抽象工厂(Creator):这个抽象类(或接口)声明一个创建对象的工厂方法,用来返回一个Product类型的对象. 具体工厂(ConcreteCreator):重定义工厂方法,返回一个具体的Concrete Product实例. 抽象产品(Product):定义工厂方法所创建的对象 具体产品(ConcreteProduct): 具体产品,继承自Product抽象类. 解读 UML图 c#代码

【设计模式】 抽象工厂模式 Abstract Factory Pattern

简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式相对于简单工厂和工厂方法模式来着更具抽象性. 一.抽象工厂模式演绎 我们先来看一个简单的需求: 甲方要开发一套办公自动化软件,其中有一个非常重要的功能就是要能够导入Word 文档和Excel 文档. 开发人员拿到需求后就开始编码了,  很快代码写完了: public class ImportTool

抽象工厂模式(Abstract Factory)

抽象工厂模式是对象的创建模式,他是工厂方法模式的进一步推广. 假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产品等级结构.那么为了将消费这些产品对象的责任和创建这些产品对象的责任分割开来,可以引进抽象工厂模式.这样的话,消费一方不需要直接参与产品的创建工作,而只需要向一个公用的工厂接口请求所需要的产品. 抽象工厂模式的结构: 抽象工厂(AbstractFactory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统的商业逻辑无关的.通常使用java接口或者抽象java类实现,

Objective-C设计模式——抽象工厂模式Abstract Factory(对象创建)

抽象工厂模式 理解了工厂方法模式,其实抽象工厂和工厂方法模式有很多的相似之处.抽象工厂同样是分离客户端对象的创建和逻辑代码的,但是抽象工厂往往是产生一组数据而不单单是产生一个产品. 抽象工厂提供一个创建一系列相关或相互依赖对象接口,而无需制定它们具体的类. 抽象工厂与工厂方法 抽象工厂 通过对象组合创建抽象产品 创建多系列产品 必须修改父类的接口才能支持新的产品 工厂方法 通过类继承创建抽象产品 创建一种产品 子泪花创建者并重载工厂方法以创建新产品 Demo 比较多就不一一的贴代码了,截类图 客