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