微信扫一扫打赏支持

北风设计模式课程---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();
?>

 

 

 

 

 

 

 
posted @ 2019-05-30 00:24  范仁义  阅读(262)  评论(0编辑  收藏  举报