简单工厂模式
定义
简单工厂模式是一个工厂对象决定创建出哪一种产品类的实例。它存在的目的很简单:定义一个创建对象的接口。
结构
1.工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。
2.抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。
3.具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
简单例子
//抽象产品角色
public interface Fruit {
void name();
}
//具体产品角色
class Apple implements Fruit{
public void name(){
System.out.Println("apple");
}
}
class Banana implements Fruit{
public void name(){
System.out.Println("banana");
}
}
//工厂对象
class FruitFactory{
public static Fruit getFruit(String name){
if(name.equals("apple"){
return new Apple();
}else if(name.equals("banana")){
return new Banana();
}
return null;
}
}
优缺点
- 优点:能根据用户的条件动态创建对象.
- 缺点:当需要增加一种产品时,需要在工厂类添加对应的逻辑,不符合开闭原则.
工厂方法模式
定义一个创建对象的接口,由子类决定实例化哪个对象,将对象的实例化延迟到子类实现
结构
1.抽象工厂:提供创建产品的接口
2.具体工厂:实现抽象工厂的抽象方法,完成对产品的创建
3.抽象产品:定义产品的规范
4.具体产品:实现了抽象产品所定义的接口,由具体工厂来创建,与具体工厂是一对一的关系
实现
//抽象产品角色
public interface Fruit {
void name();
}
//具体产品角色
class Apple implements Fruit{
public void name(){
System.out.Println("apple");
}
}
class Banana implements Fruit{
public void name(){
System.out.Println("banana");
}
}
//抽象工厂
interface FruitFactory{
Fruit getFruit();
}
//具体工厂
class AppleFactory implements FruitFactory{
public Fruit getFruit(){
return new Apple();
}
}
class BananaFactory implements FruitFactory{
public Fruit getFruit(){
return new Banana();
}
}
优缺点
优点
- 用户只需要知道具体工厂的名称即可以得到需要的产品,无需知道产品的创建过程
- 添加产品时只需要添加具体产品和具体工厂类,无需对原工厂做修改,满足开闭原则
缺点
- 每增加一个产品就需要增加一个具体产品和具体工厂,增加了系统的复杂度
抽象工厂模式
工厂方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机、计算机软件学院只培养计算机软件专业的学生等。
定义
抽象工厂模式考虑多等级产品的生产
结构
1.抽象工厂:提供了创建产品的接口,,可以创建多个不同等级的产品。
2.具体工厂:主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建,生产同一产品族的产品
3.抽象产品:定义了产品的规范,描述了产品的主要特性和功能,定义同一级别产品的规范
4.具体产品:实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。
实现
//抽象产品
interface phone{
}
interface Computer{
}
//具体产品
class HuaWeiPhone implements Phone{
}
class HuaWeiComputer implements Computer{
}
class XiaoMiPhone implements Phone{
}
class XiaoMiComputer implements Computer{
}
//抽象工厂
interface ProductFactory{
Phone producePhone();
Computer produceComputer();
}
//具体工厂
class HuaWeiFactory{
public Phone producePhone(){
return new HuaWeiPhone();
}
public Computer produceComputer(){
return new HuaWeiComputer();
}
}
class XiaoMiFactory{
public Phone producePhone(){
return new XiaoMiPhone();
}
public XiaoMi produceComputer(){
return new XiaoMiComputer();
}
}