zoukankan      html  css  js  c++  java
  • 设计模式学习之抽象工厂(Abstract Factory,创建型模式)(3)

    假如我们的苹果和香蕉还分为北方的和南方的,那么苹果Apple和香蕉Banana就是抽象类了,所以采集的方法就应该抽象的

    第一步:

    我们会创建北方的苹果NorthApple类和SourthBanana类,这两个类继承Apple,北方的香蕉NorthBanana类和SourthBanana类,其中实现各自的采集方法get()

    第二步:

    当然我们通过北方水果工厂NorthFruitFactory和南方水果工厂SourthFruitFactory来获取北方的苹果和香蕉这两个实例,这两个工厂实现FruitFactory这个接口,接口中有两个未实现的获取苹果和香蕉的实例方法,由NorthFruitFactory和SourthFruitFactory具体实现

    第三步:

    当我们调用的时候就可以通过抽象工厂来获取想要的实例对象,通过实例对象来调用对应的方法

    FruitFactory factory = new SourthFruitFactory();
    Fruit fruit =factory.getApple();//获取南方的苹果
    fruit.get();

    代码如下:

    Fruit.java

    package com.designpattern.abstractfactory;
    
    public interface Fruit {
        public void get();
    }


    Apple.java

    package com.designpattern.abstractfactory;
    
    public abstract class Apple implements Fruit{
        public abstract void get();
    }

    Banana.java

    package com.designpattern.abstractfactory;
    
    public abstract class Banana implements Fruit{
        public abstract void get();
    }

    NorthApple.java

    package com.designpattern.abstractfactory;
    
    public class NorthApple extends Apple {
        public void get() {
            System.out.println("采集北方苹果");
        }
    
    }

    NorthBanana.java

    package com.designpattern.abstractfactory;
    
    public class NorthBanana extends Banana {
        public void get() {
            System.out.println("采集北方香蕉");
        }
    
    }

    SourthApple.java

    package com.designpattern.abstractfactory;
    
    public class SourthApple extends Apple {
        public void get() {
            System.out.println("采集南方苹果");
        }
    
    }

    SourthBanana.java

    package com.designpattern.abstractfactory;
    
    public class SourthBanana extends Banana {
        public void get() {
            System.out.println("采集南方香蕉");
        }
    
    }

    FruitFactory.java

    package com.designpattern.abstractfactory;
    
    public interface FruitFactory {
        public Fruit getApple();
        public Fruit getBanana();
    }

    NorthFruitFactory.java

    package com.designpattern.abstractfactory;
    
    public class NorthFruitFactory implements FruitFactory {
    
        public Fruit getApple() {
            return new NorthApple();
    
        }
    
        public Fruit getBanana() {
            return new NorthBanana();
    
        }
    
    }

    SourthFruitFactory.java

    package com.designpattern.abstractfactory;
    
    public class SourthFruitFactory implements FruitFactory {
    
        public Fruit getApple() {
            return new SourthApple();
            
        }
    
        public Fruit getBanana() {
            return new SourthBanana();
            
        }
    
        
    }

    MainClass.java

    package com.designpattern.abstractfactory;
    
    public class MainClass {
        public static void main(String[] args) {
            FruitFactory factory = new SourthFruitFactory();//我们只需要知道具体的工厂,而不需要知道具体的类
            Fruit fruit =factory.getApple();
            fruit.get();
        }
    }

    一、什么是抽象工厂模式

    在讲解抽象工厂模式之前,我们需要知道两个概念:

            产品等级结构。产品的等级结构也就是产品的继承结构。例如一个为空调的抽象类,它有海尔空调、格力空调、美的空调等一系列的子类,那么这个抽象类空调和他的子类就构成了一个产品等级结构,苹果就分为北方苹果和南方苹果。

            产品族。产品族是在抽象工厂模式中的。在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。比如,海尔工厂生产海尔空调。海尔冰箱,那么海尔空调则位于空调产品族中。北方水果工厂就生产北方的苹果和北方的香蕉。

    抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。

    二、抽象工厂的优缺点

    优点

               1、  抽象工厂隔离了具体类的生成,是的客户端不需要知道什么被创建。所有的具体工厂都实现了抽象工厂中定义的公共接口,因此只需要改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。

               2、  当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。

    缺点

               添加新的行为时比较麻烦。如果需要添加一个新产品族对象时,需要更改接口及其下所有子类,这必然会带来很大的麻烦。

  • 相关阅读:
    小制作之放大镜
    水平居中&垂直居中
    图片引入&路径问题
    接触网页的第一天
    Java 线程 面试题
    JAVA 名言精句
    字符串工具类
    js动态生成checkbox表单并设置为单选
    idea快捷键汇总(使用率高)
    XML mapping 数据解析
  • 原文地址:https://www.cnblogs.com/yxlblogs/p/3527517.html
Copyright © 2011-2022 走看看