zoukankan      html  css  js  c++  java
  • 北风设计模式课程---1、简单工厂模式

    北风设计模式课程---1、简单工厂模式

    一、总结

    一句话总结:

    实质:通过一个专门的类来负责创建其它类的【实例】(通过实例调用方法),被创建的实例通常都有共同的父类。
    牢记:工厂产出的东西是产品,也就是实例,也就是类对应的对象

    1、简单工厂模式实例?

    抽象角色:水果接口:苹果类和香蕉类都继承了水果接口,分别实现了采集(get)方法
    具体产品角色:苹果类和香蕉类都继承了水果接口,分别实现了采集(get)方法
    工厂角色:水果工厂里面实现了取苹果和取香蕉 【对象】 的(静态)方法

    2、简单工厂模式中包含的角色及其职责?

    工厂角色:【注意工厂创建的是产品对象】:是此模式的核心类,内部提供静态工厂方法,用于创建所需产品对象,可被外界直接调用。
    抽象角色:【比如这里的水果接口,里面有抽象公有方法(采集)】:是工厂类创建的所有对象的父类或共有的接口,封装各种产品对象的公有方法。
    具体产品角色:【比如这里的苹果类和香蕉类】:是此模式的创建目标,每个具体产品都继承了抽象产品角色,实现抽象产品角色中的抽象方法。

    3、简单工厂模式总结?

    简单工厂模式实现了对象的“创建”和“使用”的分离,遵循了“单一职责原则”,但增加新的产品对象时须修改工厂类静态方法,违背了“开闭原则”。
    工厂类集中了所有产品创建逻辑(几乎是全能的),一旦不能工作,整个系统影响很大。
    工厂类中使用了静态工厂方法,造成该类方法无法形成基于继承的等级结构。

    4、简单工厂模式,优化一下违背的“开闭原则”之后,是什么设计模式?

    工厂方法模式

    5、简单工厂模式真正的好处是什么?

    我们需要吃苹果的时候我们直接从市场里面去买,我们不用关心苹果是从哪里采摘的,我们也不用关心苹果是怎么采摘的。同理吃梨的时候也是。

    6、工厂角色逐步的优化过程?

    第一次:两个方法来生成两个实例(getApple()获取苹果实例,getBanana()获取香蕉实例)
    第二次:根据参数的参数(apple,banana),用if选择结构来给出实例
    第三次:动态加载类,省去了if判断:Class fruit = Class.forName(type);  return (Fruit) fruit.newInstance();
    public class FruitFactory {
    //    /*
    //     * 获得Apple类的实例
    //     */
    //    public static  Fruit getApple() {
    //        return new Apple();
    //    }
    //    
    //    /*
    //     * 获得Banana类实例
    //     */
    //    public static Fruit getBanana() {
    //        return new Banana();
    //    }
        /*
         * get方法,获得所有产品对象
         */
        public static Fruit getFruit(String type) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
    //        if(type.equalsIgnoreCase("apple")) {
    //            return Apple.class.newInstance();
    //            
    //        } else if(type.equalsIgnoreCase("banana")) {
    //            return Banana.class.newInstance();
    //        } else {
    //            System.out.println("找不到相应的实例化类");
    //            return null;
    //        }
                Class fruit = Class.forName(type);
                return (Fruit) fruit.newInstance();
            
            
        }
    }

    二、内容在总结中

    1、相关知识

     

    2、java实现

     抽象角色:Fruit.java

    public interface Fruit {
        /*
         * ²ΙΌ―
         */
        public void get();
    }

    产品角色1:Apple.java

    public class Apple implements Fruit{
        /*
         * 采集
         */
        public void get(){
            System.out.println("采集苹果");
        }
    }

    产品角色2:Banana.java

    public class Banana implements Fruit{
        /*
         * ²ΙΌ―
         */
        public void get(){
            System.out.println("²ΙΌ―Ο㽶");
        }
    }

    工厂角色:FruitFactory.java

    public class FruitFactory {
    //    /*
    //     * 获得Apple类的实例
    //     */
    //    public static  Fruit getApple() {
    //        return new Apple();
    //    }
    //    
    //    /*
    //     * 获得Banana类实例
    //     */
    //    public static Fruit getBanana() {
    //        return new Banana();
    //    }
        /*
         * get方法,获得所有产品对象
         */
        public static Fruit getFruit(String type) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
    //        if(type.equalsIgnoreCase("apple")) {
    //            return Apple.class.newInstance();
    //            
    //        } else if(type.equalsIgnoreCase("banana")) {
    //            return Banana.class.newInstance();
    //        } else {
    //            System.out.println("找不到相应的实例化类");
    //            return null;
    //        }
                Class fruit = Class.forName(type);
                return (Fruit) fruit.newInstance();
            
            
        }
    }

    调用入口:MainClass.java

    public class MainClass {
        public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
    //        //实例化一个Apple
    //        Apple apple = new Apple();
    //        //实例化一个Banana
    //        Banana banana = new Banana();
    //        
    //        apple.get();
    //        banana.get();
            
    //        //实例化一个Apple,用到了多态
    //        Fruit apple = new Apple();
    //        Fruit banana = new Banana();
    //        apple.get();
    //        banana.get();
            
    //        //实例化一个Apple
    //        Fruit apple = FruitFactory.getApple();
    //        Fruit banana = FruitFactory.getBanana();
    //        apple.get();
    //        banana.get();
            
            Fruit apple = FruitFactory.getFruit("Apple");
            Fruit banana = FruitFactory.getFruit("Banana");
            apple.get();
            banana.get();
            
        }
    }

    3、简单工厂模式的php实现

    代码:

    <?php
    //抽象角色
    Interface Fruit{
        //采集
        public function get();
    };
    
    //具体角色1
    class Apple implements Fruit{
        public function get(){
            echo '采集苹果<br>';
        }
    }
    //具体角色2
    class Banana implements Fruit{
        public function get(){
            echo '采集香蕉<br>';
        }
    }
    
    //工厂角色
    class FruitFactory{
        public static function getFruit($fruitName){
            if($fruitName=='apple'){
                return new Apple();
            }else if($fruitName=='banana'){
                return new Banana();
            }else{
                echo '没找到所需要的水果<br>';die;
            }
        }
    }
    
    //调用实例
    FruitFactory::getFruit('apple')->get();
    FruitFactory::getFruit('banana')->get();
    FruitFactory::getFruit('pear')->get();
    ?>
     
  • 相关阅读:
    一种通用的简易缓存设计方案
    SpringCloud接入Passport中台服务的FeignClient简易集成配置
    一种基于P2P技术的高效数据传输方式
    应用多环境部署和Redis高可用
    瑞金小吃
    前(单页面)后端完全分离的OAuth2授权和分享
    Session(数据)共享的前后端分离Shiro实战
    10万Http(单机和集群Server)Subscribe的可行性实验和压测
    2018年你应该了解的前端新技术
    js常见问题总结归纳
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/10947252.html
Copyright © 2011-2022 走看看