设为首页 加入收藏

TOP

设计模式一:简单工厂模式(一)
2019-09-30 16:45:10 】 浏览:108
Tags:设计模式 简单 工厂 模式

简单工厂模式

概念

简单工厂模式属于创建型模式,又叫做静态工厂方法(Static Factory Method)。简单工厂模式是由一个工厂对象决定创建哪一种产品类实例。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为不同工厂模式的一个特殊实现

值得注意的是,简单工厂模式并不属于GOF设计模式之一。但是他说抽象工厂模式,工厂方法模式的基础,并且有广泛得应用

模式结构

组成

从上图中可以看出,简单工厂模式由三部分组成:具体工厂、抽象产品和具体产品

  • 工厂类(Creator):这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中,它往往由一个具体的类实现
  • 抽象产品(AbstractProduct):它一般是具体产品继承的父类或者实现的接口。在Java中,由接口或者抽象类实现
  • 具体产品(ConcreteProduct):工厂类所创建的对象就是此角色的实例。在java中 由一个具体的类实现

实例分析

需求:有苹果类和香蕉类,他们都有get方法,通过主函数对它们进行实例化,并调用get方法

方式一:最基本的实例化

Apple.java:
public class Apple {
    /**
     * 采集苹果
     */
    public void get(){
        System.out.println("采集苹果");
        }
}
Banana.java:
public class Banana {
    /**
     * 采集香蕉
     */
    public void get(){
        System.out.println("采集香蕉");
    }
}
MainClass.java:
public class Mainclass{
    public static void main(String[] args){
        /**
         * 最基本的实例化方式
         */
        //实例化一个Apple
        Apple apple = new Apple();
        //实例化一个Banana
        Banana banana = new Banana();
        
        apple.get();
        banana.get();
    }
}

方式二:都有get方法,我们可以用多态的方式抽象出一个接口类实现

Fruit.java:
public interface Fruit {
    public void get();
}
Apple.java:
public class Apple implements Fruit{
    @Override
    //重写get方法
    public void get(){
        System.out.println("采集苹果");
    }
}
Banana.java:
public class Banana implements Fruit{
    @Override
    //重写get方法
    public void get(){
        System.out.println("采集香蕉");
    }
}
MainClass.java:
public class Mainclass{
    public static void main(String[] args){
        /**
         * 多态的实例化方式
         */
        Fruit apple = FruitFactory.getApple();
        Fruit banana = FruitFactory.getBanana();

        apple.get();
        banana.get();
    }
}

方式三:新增一个工厂类实现对象的创建和主要逻辑

FruitFactory:
public class FruitFactory {
    /**
     * 获得Apple类的实例
     */
    public static Fruit getApple(){
        return new Apple();
    }

    /**
     * 获得Banana类的实例
     */
    public static Fruit getBanana(){
        return new Banana();
    }
}
Fruit.java:不变
public interface Fruit {
    public void get();
}
Apple.java:不变
public class Apple implements Fruit{
    @Override
    //重写get方法    
    public void get(){
        System.out.println("采集苹果");
    }
}
Banana.java:不变
public class Banana implements Fruit{
    @Override
    //重写get方法
    public void get(){
        System.out.println("采集香蕉");
    }
}
MainClass.java:不变
public class Mainclass{
    public static void main(String[] args){
        /**
         * 通过工厂类的静态方法实例化
         */
        Fruit apple = FruitFactory.getApple();
        Fruit banana = FruitFactory.getBanana();

        apple.get();
        banana.get();
    }
}

方式四:优化工厂类一,调用相同的方法,通过传参的方式实例化

FruitFactory:
public class FruitFactory {
    public static Fruit getFruit(String type) throws IllegalAccessException, ClassNotFoundException, InstantiationException {
        /**
         * 对参数的判断并返回实例
         */
        if (type.equalsIgnoreCase("apple")){
            return Apple.class.newInstance();
        } else if (type.equalsIgnoreCase("banana")){
            return Banana.class.newInstance();
        } else {
            System.out.println("找不到相应的实例化类");
            return null;
        }
    }
}
Fruit.java:不变
public interface Fruit {
    public void get();
}
Apple.java:不变
public class Apple implements Fruit{
    @Override
    public void get(){
        System.out.println("采集苹果");
    }
}
Banana.java:不变
public class Banana implements Fruit{
    @Override
    public void get(){
        System.out.println("采集香蕉");
    }
}
MainClass.java:
public class Mainclass{
    public static void main(String[] args) throws
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇JAVA设计模式---总述篇 下一篇Docker 私服Registry简介与使用Do..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目