抽象工厂模式怎么理解? 抽象工厂模式,对工厂的抽象。具体实现的工厂可以区分产品族。 抽象水果工厂(获取苹果,获取香蕉) <-- 北方水果工厂(获取苹果[北方苹果] , 获取香蕉[北方香蕉]) <-- 南方水果工厂(获取苹果[南方南方苹果] , 获取香蕉[香蕉])
抽象工厂负责规范工厂业务,具体实现的工厂区分产品族。
水果(采摘水果) <-- 苹果(采摘苹果)<-- 北方苹果()
<-- 南方苹果()
<-- 香蕉(菜摘香蕉)
<-- 北方香蕉()
<-- 南方香蕉()
水果工厂抽象(获取苹果实例 , 获取香蕉实例) <-- 南方水果工厂(获取南方苹果实例, 获取南方香蕉实例)
<-- 北方水果工厂(获取北方苹果实例, 获取北方香蕉实例)
Main:
北方苹果 = new 北方水果厂() . 获取北方苹果。
南方苹果 = new 南方水果厂() . 获取南方苹果。
什么是工厂方法模式
工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,
仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
角色:
抽象工厂角色:
一个抽象的工厂类。具体的工厂类实现抽象工厂类(具体的创建过程由具体的工厂类实现)。
具体工厂角色:
实现了抽象工厂的工厂。用来实例化某一具体实例。
苹果有苹果的工厂,香蕉有香蕉的工厂。
抽象角色:
所有具体实例的共有父类。
具体产品角色:
工厂生产出来的具体产品。
简单工厂模式 和 工厂方法模式的区别:
工厂方法模式:将简单工厂模式的 工厂类抽象成为接口,具体的工厂类实现该接口并实现实例化代码。
简单工厂模式只有一个继承体系,工厂方法模式有两个继承体系。
简单工厂模式是什么?
能干什么?: 通过专门定义一个类来负责创建其他类的实例,被创建的实例一般都有共同的父类。(也叫静态工厂模式,因为工厂中的方法是静态的) 模式中包含的角色: 工厂角色: 简单工厂模式的核心,他负责实现所有实例的内部逻辑,工厂类可以被外界直接调用创建所需的对象。 抽象产品角色: 简单工厂模式创建的所有实例的共同父类,用于描述所有实例的公共接口。 具体产品角色: 简单工厂模式创建出的具体实例对象。 优缺点? 工厂角色实现每一种具体的实例逻辑(所有实例的创建逻辑都在这个类里面)。 所有的创建逻辑都写在了一起,内聚不够高。当需要添加产品类时,需要修改工厂方法,扩展性不好。 如果想要扩展具体的类。需要的工厂类中添加具体的实例化代码。 不符合 开放 - 封闭(OCP) 原则 (开放是指:现有代码可扩展,封闭是指:扩展的时候不需要修改现有的代码) 案例 想要吃苹果,你不需要去苹果树上摘,你只需要去生产苹果的工厂买。 Apple 和 Banana 实现了 Fruit 接口。 使用 FruitFactory 工厂类创建 Apple 和 Banana 的实例。 MainClass 为调用主类。
苹果类:
package factory.sumpleFactory.product;
import factory.sumpleFactory.productImpl.Fruit;
public class Apple implements Fruit {
@Override
public void get() {
System.out.println("采集苹果");
}
}
香蕉类:
package factory.sumpleFactory.product;
import factory.sumpleFactory.productImpl.Fruit;
public class Banana implements Fruit {
@Override
public void get() {
System.out.println("采集香蕉");
}
}
水果抽象接口:
package factory.sumpleFactory.productImpl;
/**
* 抽象角色
*/
public interface Fruit {
void get();
}
水果工厂方法:
package factory.sumpleFactory.factory;
import factory.sumpleFactory.product.Apple;
import factory.sumpleFactory.product.Banana;
import factory.sumpleFactory.productImpl.Fruit;
/**
* 工厂角色
*/
public class FruitFactory {
/**
* get方法获取所有具体实例
* @param type 要获取什么类型的水果(类名)
* @return 返回水果
*/
public static Fruit getFruit(String type) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
/*
// 根据字符串判断
if(type.equalsIgnoreCase("apple")){
return Apple.class.newInstance();
}else if(type.equalsIgnoreCase("banana")){
return Banana.class.newInstance();
}else {
return null;
}
*/
// 直接根据类名创建实例
Class frute = Class.forName(type);
return (Fruit) frute.newInstance();
}
}
主方法:
package factory.sumpleFactory;
import factory.sumpleFactory.factory.FruitFactory;
import factory.sumpleFactory.product.Apple;
import factory.sumpleFactory.product.Banana;
public class MainClass {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
Apple apple = (Apple) FruitFactory.getFruit("Apple");
Banana banana = (Banana)FruitFactory.getFruit("Banana");
}
}