Java设计模式笔记之抽象工厂代码示例

上一篇说到了工厂模式,那么学习了工厂模式,抽象工厂也得学习一下。实际上,抽象工厂模式实际上就是在工厂模式的基础上再嵌套一层工厂模式而已,通过父工厂制造子工厂。只是,也并不完全是嵌套一层,各个工厂会被抽象成一个集多个工厂共同点的抽象类。通过工厂制造器,创建出该抽象工厂的子类。

好比如说,一个博客页面有个换肤系统。那么假如有两套风格,黑和白。那么,我选择了黑色风格的,实际这步就相当通过换肤系统这个工厂制造器,创建出一个黑色主题的工厂,该黑色主题的工厂内可以生产各种黑色风格的产品,比如黑色头像挂饰,黑色背景,黑色的xxx等,然后通过这些黑色主题产品完成了整个换肤操作。白色主题也如此。

好吧,上次以水果工厂作为一个类,那么这次要创建一个蔬菜工厂,水果和蔬菜这两类都属于种植物,那么我们就可以根据这一共同点抽象出一个种植物抽象类,即种植物工厂。

首先,创建产品类,包括上次的水果,和现在的蔬菜,他们都实现了水果类接口和蔬菜类接口:

水果系列:

public interface Fruit {
  void printInfo();
} 
public class Apple implements Fruit{
  @Override
  public void printInfo() {
    // TODO Auto-generated method stub
    System.out.println("苹果");
  }
} 
public class Banana implements Fruit{
  @Override
  public void printInfo() {
    // TODO Auto-generated method stub
    System.out.println("香蕉");
  }
} 
public class Orange implements Fruit{
  @Override
  public void printInfo() {
    // TODO Auto-generated method stub
    System.out.println("橙子");
  }
} 

接着是蔬菜系列:

public interface Vegetable {
  public void printInfo();
} 
public class Tomato implements Vegetable{
  @Override
  public void printInfo() {
    // TODO Auto-generated method stub
    System.out.println("西红柿");
  }
} 
public class Cabbage implements Vegetable{
  @Override
  public void printInfo() {
    // TODO Auto-generated method stub
    System.out.println("白菜");
  }
} 
public class Eggplant implements Vegetable{
  @Override
  public void printInfo() {
    // TODO Auto-generated method stub
    System.out.println("茄子");
  }
} 

然后,是它们各自的工厂类:

水果工厂:

public class FruitFactory extends PlantFactory{
  public static final int APPLE=1;
  public static final int BANANA=2;
  public static final int ORANGE=3;
  @Override
  public Fruit getFruit(int fruitType){
    if(fruitType==APPLE){
      return new Apple();
    }
    if(fruitType==BANANA){
      return new Banana();
    }
    if(fruitType==ORANGE){
      return new Orange();
    }
    return null;
  }
  @Override
  Vegetable getVegetable(int vegetableType) {
    // TODO Auto-generated method stub
    return null;
  }
} 

蔬菜工厂:

public class VegetableFactory extends PlantFactory {
  public static final int CABBAGE=1;
  public static final int TOMATO=2;
  public static final int EGGPLANT=3;
  @Override
  Fruit getFruit(int fruitType) {
    // TODO Auto-generated method stub
    return null;
  }
  @Override
  public Vegetable getVegetable(int vegetableType) {
    // TODO Auto-generated method stub
    if(vegetableType==CABBAGE){
      return new Cabbage();
    }
    if(vegetableType==TOMATO){
      return new Tomato();
    }
    if(vegetableType==EGGPLANT){
      return new Eggplant();
    }
    return null;
  }
} 

可以看到,它们都是属于种植物这一类,所以都是继承了种植工厂类

public abstract class PlantFactory {
  abstract Fruit getFruit(int fruitType);
  abstract Vegetable getVegetable(int vegetableType);
} 

最后,提供一个工厂生产器,即生产工厂的工厂:

public class Plantation {
  public static final int FRUIT=1;
  public static final int VEGETABLE=2;
  public static PlantFactory getFactory(int factoryType){
    if(factoryType==FRUIT){
      return new FruitFactory();
    }
    if(factoryType==VEGETABLE){
      return new VegetableFactory();
    }
    return null;
  }
} 

好吧,写个main测试下:

public static void main(String[] args) {
  // TODO Auto-generated method stub 

  FruitFactory fruitFactory=(FruitFactory)Plantation.getFactory(Plantation.FRUIT);
  Apple apple=(Apple) fruitFactory.getFruit(FruitFactory.APPLE);
  apple.printInfo(); 

  VegetableFactory vegetableFactory=(VegetableFactory)Plantation.getFactory(Plantation.VEGETABLE);
  Tomato tomato=(Tomato) vegetableFactory.getVegetable(VegetableFactory.TOMATO);
  tomato.printInfo();
} 

结果:

苹果
西红柿

虽然工厂设计模式在获取产品类时很方便,但实际上产品的需求越严格,那么内部系统则越发庞大复杂,对于生产一些小产品来说,使用这么复杂庞大的系统反而浪费资源。

总结

以上就是本文关于Java设计模式笔记之抽象工厂代码示例的全部内容。代码是一个人主观意志的客观反映。。。胡扯了,参考别人写的代码,另外,多看看源码也是有好处的,学习别人实现某个功能的设计思路,来提高自己的编程水平。欢迎参阅:Java多线程之线程通信生产者消费者模式及等待唤醒机制代码详解、Java单例模式实现静态内部类方法示例等,有什么问题可以随时留言,欢迎大家交流讨论。

(0)

相关推荐

  • Java设计模式之代理模式与装饰模式实例详解

    本文实例讲述了Java设计模式之代理模式与装饰模式.分享给大家供大家参考,具体如下: 之所以把这两种模式放在一起说,是因为我发现这了两种模式几乎一模一样! 从网上也搜了一些资料,发现两者还是有一些区别的.我们在学习的同时也把这种困惑搞清楚. 定义: 代理模式,为其他对象提供一种代理以控制对这个对象的访问. 装饰模式,动态地给一个对象添加一些额外的职责. 代理模式,很好理解,就是把一个对象再次封装,以后就对封装的对象访问就可以了. 因为代理对象已经取代了被代理对象. 装饰模式,给一个对象增加功能,

  • Java设计模式——工厂设计模式详解

    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类. 工厂模式的形态 工厂模式主要用一下几种形态: 1:简单工厂(Simple Factory). 2:工厂方法(Factory Method). 3:抽象工厂(Abstract Factory). 简单工厂(Simple Factory) 又叫静态工厂,是工厂模式三中状态中结构最为简单的.主要有一个静态方法,用来接受参数,并根据参数来决定返回实现同一接口的不同类的实例.我们来看一个具体的例子: 假设一家工厂,几生产洗衣

  • Java设计模式之桥接模式实例详解

    本文实例讲述了Java设计模式之桥接模式.分享给大家供大家参考,具体如下: 概念: 桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化. 桥接模式将继承关系转换为关联关系,从而降低了类与类之间的耦合,减少了代码编写量. 什么情况下会用桥接模式? 简单的说就是我们在抽象对象的特征时,对象的特征属性又很抽象,不得不把属性再次抽象. 否则的话,具体子类的数量将会成几何增长,而且不易扩展.没办法维护现有代码. 举例,我们在抽象手机这二个对象时,它的几个属性,如

  • java中设计模式之适配器模式

    java中设计模式之适配器模式  前言: 适配器模式可以将一个类或接口应用于另一个不同但是却有联系的接口,主要的做法是通过声明一个目标接口的实现类,在该类中声明一个将被适配类或接口(被适配者)作为参数的构造器和被适配者的实例,这样在实现目标接口的时候就可以调用被适配者的实例,并且辅以一些额外的操作.适配器模式的主体有三个部分:适配者,适配者实现类和被适配者.具体类结构如下图: 这里将被适配者的对象以组合的方式放到适配器类中,那么被适配者及其实现者都可以使用该适配器.适配器模式的优点在于可以将不同

  • Java设计模式之建造者模式实例详解

    本文实例讲述了Java设计模式之建造者模式.分享给大家供大家参考,具体如下: 建造者模式(builder)可以将部件和其组装过程分开.一步一步创建一个复杂的对象. 用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节. 什么情况下会用到建造者模式? 个人理解,当我们创建的对象在创建时需要逻辑的时候. 比如,一个简单的pojo对象,我们想要创建,直接就可以new出来,没有什么逻辑. 当有一个复杂的对象,你想要创建它时,它的各个属性之间是有逻辑关系的. 一个属性赋值取值依赖于

  • Java设计模式笔记之抽象工厂代码示例

    上一篇说到了工厂模式,那么学习了工厂模式,抽象工厂也得学习一下.实际上,抽象工厂模式实际上就是在工厂模式的基础上再嵌套一层工厂模式而已,通过父工厂制造子工厂.只是,也并不完全是嵌套一层,各个工厂会被抽象成一个集多个工厂共同点的抽象类.通过工厂制造器,创建出该抽象工厂的子类. 好比如说,一个博客页面有个换肤系统.那么假如有两套风格,黑和白.那么,我选择了黑色风格的,实际这步就相当通过换肤系统这个工厂制造器,创建出一个黑色主题的工厂,该黑色主题的工厂内可以生产各种黑色风格的产品,比如黑色头像挂饰,黑

  • java开发的工厂方法模式及抽象工厂验证示例

    目录 工厂方法模式示例 抽象工厂模式验证 结论 工厂方法模式示例 开发一个数据格式转换工具,将不同数据源如:txt.excel等格式文件,转换为XML格式输出,需考虑今后其他格式的文件也需要转换为xml格式的扩展性,利用设计模式的有关知识进行设计. 解决思路,使用工厂方法模式完成该功能的设计,设计类图如下: 代码结构如下: 代码如下: public interface Creator { Convertor getConvertor(); } public class ExcelConverto

  • Java 超详细讲解设计模式之中的抽象工厂模式

    目录 抽象工厂模式 1.什么是抽象工厂 2.抽象工厂模式的优缺点 3.抽象工厂模式的结构与实现 4.抽象工厂方法模式代码实现 5.抽象工厂模式的应用场景 6.抽象工厂模式的扩展 抽象工厂模式 前面文章介绍的工厂方法模式中考虑的是一类产品的生产,比如案例中的百事可乐工厂只能生产百事可乐,可口可乐工厂只能生产可口可乐,也就是说:工厂方法模式只考虑生产同等级的产品. 1.什么是抽象工厂 在现实生活中许多工厂是综合型的工厂,能生产多种类)的产品,就拿案例里面的可乐来说,在节日的时候可能会有圣诞版的可乐,

  • Java设计模式笔记之Builder模式

    目录 Builder模式是怎么来的 关于Builder的一点说明 线程安全问题 经典的Builder模式 总结 当我第一次使用Picasso的时候,看见下面的官网示例时,我和我的小伙伴都惊呆了! Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView); 如此简洁明了的使用方式,如此灵活多变的链式调用,让我深深地迷住了,然后我一直苦苦追求它,奈何天资愚笨,不知如何掀起它的神秘面纱... 不好

  • Java 深入探究讲解抽象工厂模式

    目录 1. 抽象工厂模式解决 2. 抽象工厂类图UML 3. 抽象工厂模式的主要角色 4. 代码实现 5. 抽象工厂方法再探究 6. 优缺点 7. 适用示例 解决工厂方法模式的问题:一个具体工厂只能创建一类产品,而实际过程中一个工厂往往需要生成很多的产品,这种可以采用抽象工厂模式. 1. 抽象工厂模式解决 定义:提供一个创建一系列相关或者互相依赖对象的接口,无需指定他们的具体的类,具体的工厂负责实现具体的产品的实例.使一个工厂可以产生多个产品. 2. 抽象工厂类图UML 3. 抽象工厂模式的主要

  • Java设计模式之责任链模式的示例详解

    目录 应用场景 实际代码案例 无模式情况下的代码 采用责任链模式优化代码 采用建造者+责任链模式优化代码 责任链模式优缺点 责任链模式是将链中的每一个节点看做是一个对象,每个节点处理的请求均不相同,且内部自动维护下一个节点对象,当一个请求从链式的首段发出时,会沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求位置,属于行为模式. 这里需要注意的是每个节点都能对对象进行一定的处理(也可以不处理),处理完成之后节点再进行判断还要进行后续处理还是说传递给下一个节点. 应用场景 首先举一个日常

  • java算法实现红黑树完整代码示例

    红黑树 定义 红黑树(英语:Red–black tree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组. 红黑树的另一种定义是含有红黑链接并满足下列条件的二叉查找树: 红链接均为左链接:没有任何一个结点同时和两条红链接相连:该树是完美黑色平衡的,即任意空链接到根结点的路径上的黑链接数量相同. 满足这样定义的红黑树和相应的2-3树是一一对应的. 旋转 旋转又分为左旋和右旋.通常左旋操作用于将一个向右倾斜的红色链接旋转为向左链接.对比操作前后,可以看出,该操作

  • Java编程redisson实现分布式锁代码示例

    最近由于工作很忙,很长时间没有更新博客了,今天为大家带来一篇有关Redisson实现分布式锁的文章,好了,不多说了,直接进入主题. 1. 可重入锁(Reentrant Lock) Redisson的分布式可重入锁RLock Java对象实现了java.util.concurrent.locks.Lock接口,同时还支持自动过期解锁. public void testReentrantLock(RedissonClient redisson){ RLock lock = redisson.getL

  • Java 从互联网上爬邮箱代码示例

    网页爬虫:其实就是一个程序用于在互联网中获取符合指定规则的数据. package day05; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; impor

  • java实现的各种排序算法代码示例

    折半插入排序 折半插入排序是对直接插入排序的简单改进.此处介绍的折半插入,其实就是通过不断地折半来快速确定第i个元素的 插入位置,这实际上是一种查找算法:折半查找.Java的Arrays类里的binarySearch()方法,就是折半查找的实现,用 于从指定数组中查找指定元素,前提是该数组已经处于有序状态.与直接插入排序的效果相同,只是更快了一些,因 为折半插入排序可以更快地确定第i个元素的插入位置 代码: package interview; /** * @author Administrat

随机推荐