zoukankan      html  css  js  c++  java
  • 简单工厂模式,工厂方法模式,抽象工厂模式 三大案例 (设计模式_16)

    工厂模式,细分下来为(简单工厂模式工厂方法模式抽象工厂模式 ),每一种模式的使用都是在应用场景的不同来决定;


    案例一:(简单工厂模式)
    简单工厂模式,根据工厂接收的类型来决定,返回的对象的具体实例,简单工厂模式在扩展性方面表现不足,(增加对象需要修改工厂代码,才能完成)

    简单工厂模式,实际上就是一个工厂非常简单的运用,工厂根据接收不同的类型,返回不同
    的实例对象,(想要扩展必须要修改工厂代码才行)

    package com.oop.demo5.ajiandan;
    
    /**
     * 手机标准规范,零件有很多,这里就模拟两种零件(屏幕,电池)
     * @author Liudeli
     *
     */
    public interface Phone {
    
        /**
         * 做手机屏幕
         */
        public void doScreen();
    
        /**
         * 做手机电池
         */
        public void doBattery();
    
    }
    
    package com.oop.demo5.ajiandan;
    
    /**
     * 三星手机对象
     * @author Liudeli
     *
     */
    public class SamsungPhone implements Phone {
    
        public void doScreen() {
            System.out.println("制作三星手机屏幕...");
        }
    
        public void doBattery() {
            System.out.println("制作三星手机电池...");
        }
    
    }
    
    package com.oop.demo5.ajiandan;
    
    /**
     * 华为手机对象
     * @author Liudeli
     *
     */
    public class HuaweiPhone implements Phone {
    
        public void doScreen() {
            System.out.println("制作华为手机屏幕...");
        }
    
        public void doBattery() {
            System.out.println("制作华为手机电池...");
        }
    
    }
    
    package com.oop.demo5.ajiandan;
    
    /**
     * 定义一个工厂,此工厂用于生成手机
     * @author Liudeli
     *
     */
    public class Factory {
    
        /**
         * 生成出什么牌子的手机
         * @param phone 传入给工厂信息类型
         * @return 返回真正手机实例
         */
        public static Phone getPhone(String phone) {
            Phone resultPhone = null;
            if ("huawei".equals(phone)) {
                resultPhone = new HuaweiPhone();
            } else {
                resultPhone = new SamsungPhone();
            }
            return resultPhone;
        }
    
    }
    
    package com.oop.demo5.ajiandan;
    
    import java.util.Scanner;
    
    /*
     * 简单工厂方法,实际上就是一个工厂非常简单的运用,工厂根据接收不同的类型,返回不同
     * 的实例对象,(想要扩展必须要修改工厂代码才行)
     */
    
    /**
     * 测试程序 (简单工厂模式)
     * @author Liudeli
     *
     */
    public class Test {
    
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
    
            System.out.println("input huawei/samsung ...");
            String type = scanner.nextLine();
    
            Phone phone = Factory.getPhone(type);
            phone.doBattery();
            phone.doScreen();
        }
    
    }
    

    运行结果:
    这里写图片描述

    这里写图片描述



    案例二:(工厂方法模式)
    工厂方法模式,定义创建对象接口,让子类去决定,到底要实现,那一个实例对象,此模式把开放封闭式原则,表现出来了,扩展性好;

    package com.oop.demo5.bfangfa;
    
    /**
     * 手机标准规范,零件有很多,这里就模拟两种零件(屏幕,电池)
     * @author Liudeli
     *
     */
    public interface Phone {
    
        /**
         * 做手机屏幕
         */
        public void doScreen();
    
        /**
         * 做手机电池
         */
        public void doBattery();
    
    }
    
    package com.oop.demo5.bfangfa;
    
    /**
     * 三星手机对象
     * @author Liudeli
     *
     */
    public class SamsungPhone implements Phone {
    
        public void doScreen() {
            System.out.println("制作三星手机屏幕...");
        }
    
        public void doBattery() {
            System.out.println("制作三星手机电池...");
        }
    
    }
    
    
    package com.oop.demo5.bfangfa;
    
    /**
     * 华为手机对象
     * @author Liudeli
     *
     */
    public class HuaweiPhone implements Phone {
    
        public void doScreen() {
            System.out.println("制作华为手机屏幕...");
        }
    
        public void doBattery() {
            System.out.println("制作华为手机电池...");
        }
    
    }
    
    package com.oop.demo5.bfangfa;
    
    /**
     * 定义出抽象的工厂
     * @author Liudeli
     *
     */
    public interface IFactory {
    
        /**
         * 创造手机
         * @return 返回抽象手机
         */
        public Phone createPhone();
    
    }
    
    package com.oop.demo5.bfangfa;
    
    /**
     * 华为工厂对象
     * @author Liudeli
     *
     */
    public class HuaweiFactory implements IFactory{
    
        public Phone createPhone() {
            return new HuaweiPhone();
        }
    
    }
    
    package com.oop.demo5.bfangfa;
    
    /**
     * 三星工厂对象
     * @author Liudeli
     *
     */
    public class SamsungFactory implements IFactory {
    
        public Phone createPhone() {
            return new SamsungPhone();
        }
    
    }
    
    package com.oop.demo5.bfangfa;
    
    /*
     * 工厂方法模式,创建一个对象的接口,让子类决定去实例化那个类
     * 可扩展,遵守了 开放封闭式原则
     */
    
    /**
     * 测试程序(工厂方法模式)
     * @author Liudeli
     *
     */
    public class Test {
    
        public static void main(String[] args) {
            // 用华为工厂去生成华为手机
            IFactory factory = new HuaweiFactory();
            Phone iphone = factory.createPhone();
            iphone.doBattery();
            iphone.doScreen();
        }
    
    }
    

    运行结果:
    这里写图片描述

    修改工厂改变结果:

    IFactory factory = new SamsungFactory();

    运行结果:
    这里写图片描述



    案例三:(抽象工厂模式)
    抽象工厂模式是在工厂方法模式基础上演变而来的,与其说工厂方法模式是单维的,抽象工厂模式
    就是多维的,在生活中去举例的话:生成公司,要生产(汽车,摩托车,客车,拖拉机),意思就是每一个工厂,都具备有生成(汽车,摩托车,客车,拖拉机)的能力;

    package com.oop.demo5.cchouxiang;
    
    /**
     * 手机标准规范,零件有很多,这里就模拟两种零件(屏幕,电池)
     * @author Liudeli
     *
     */
    public interface Phone {
    
        /**
         * 做手机屏幕
         */
        public void doScreen();
    
        /**
         * 做手机电池
         */
        public void doBattery();
    
    }
    
    package com.oop.demo5.cchouxiang;
    
    /**
     * 三星手机对象
     * @author Liudeli
     *
     */
    public class SamsungPhone implements Phone {
    
        public void doScreen() {
            System.out.println("制作三星手机屏幕...");
        }
    
        public void doBattery() {
            System.out.println("制作三星手机电池...");
        }
    
    }
    
    package com.oop.demo5.cchouxiang;
    
    /**
     * 华为手机对象
     * @author Liudeli
     *
     */
    public class HuaweiPhone implements Phone {
    
        public void doScreen() {
            System.out.println("制作华为手机屏幕...");
        }
    
        public void doBattery() {
            System.out.println("制作华为手机电池...");
        }
    
    }
    
    package com.oop.demo5.cchouxiang;
    
    /**
     * 抽象出电脑接口
     * @author Liudeli
     *
     */
    public interface Computer {
    
        /**
         * 做电脑适配器电源
         */
        public void doAdapter();
    
    }
    
    package com.oop.demo5.cchouxiang;
    
    /**
     * 华为电脑具体对象
     * @author Liudeli
     *
     */
    public class HuaweiComputer implements Computer {
    
        public void doAdapter() {
            System.out.println("华为电脑适配器....");
        }
    
    }
    
    package com.oop.demo5.cchouxiang;
    
    /**
     * 三星电脑具体对象
     * @author Liudeli
     *
     */
    public class SamsungComputer implements Computer {
    
        public void doAdapter() {
            System.out.println("三星电脑适配器....");
        }
    
    }
    
    package com.oop.demo5.cchouxiang;
    
    /**
     * 定义抽象工厂接口
     * @author Liudeli
     *
     */
    public interface IFactory {
    
        /**
         * 创建手机(手机有很多种,手机是抽象的概念)
         * @return 返回手机
         */
        public Phone createPhone();
    
        /**
         * 创建电脑(电脑有很多种类,电脑是被抽象出来的概念)
         * @return 返回电脑
         */
        public Computer createComputer();
    
    }
    
    package com.oop.demo5.cchouxiang;
    
    /**
     * 三星工厂对象
     * @author Liudeli
     *
     */
    public class SamsungFactory implements IFactory {
    
        public Phone createPhone() {
            return new SamsungPhone();
        }
    
        public Computer createComputer() {
            return new SamsungComputer();
        }
    
    }
    
    package com.oop.demo5.cchouxiang;
    
    /**
     * 华为工厂对象
     * @author Liudeli
     *
     */
    public class HuaweiFactory implements IFactory{
    
        public Phone createPhone() {
            return new HuaweiPhone();
        }
    
        public Computer createComputer() {
            return new HuaweiComputer();
        }
    
    }
    
    package com.oop.demo5.cchouxiang;
    
    /**
     * 抽象工厂模式是在工厂方法模式基础上演变而来的,与其说工厂方法模式是单维的,抽象工厂模式
     * 就是多维的,在生活中去举例的话:生成公司,要生产(汽车,摩托车,客车,拖拉机),意思就是每一个工厂,都具备有生成(汽车,摩托车,客车,拖拉机)的能力
     */
    
    /**
     * 测试程序(抽象工厂模式)
     */
    public class Test {
    
        public static void main(String[] asgs) {
            // 创建华为工厂
            IFactory factory = new HuaweiFactory();
    
            // 造手机
            Phone phone = factory.createPhone();
            phone.doBattery();
            phone.doScreen();
    
            // 造电脑
            Computer computer = factory.createComputer();
            computer.doAdapter();
        }
    
    }

    运行结果:
    这里写图片描述


    Project结构图:
    这里写图片描述


    谢谢大家的观看,更多精彩技术博客,会不断的更新,请大家访问,
    刘德利CSDN博客, http://blog.csdn.net/u011967006

  • 相关阅读:
    jquery easyui datebox 时间控件默认显示当前日期的实现方法
    CentOS下Web服务器环境搭建LNMP一键安装包
    EasyUI DateBox 按钮自定义添加功能
    Java程序如何生成Jar、exe及安装文件
    推荐!Sublime Text 最佳插件列表
    Sublime Text插件:HTML+CSS+JAVASCRIPT+JSON快速格式化
    java判断是excel2003还是2007以上
    Content-Type: application/vnd.ms-excel"
    小说大纲
    java判断文件真实类型
  • 原文地址:https://www.cnblogs.com/android-deli/p/10322200.html
Copyright © 2011-2022 走看看