工厂方法模式以及抽象工厂模式

工厂模式

简介

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

优点

1、调用者如果想要创建一个对象,只需要知道它的类名称就行了,而无需知道它是如何创建出来的。

2、扩展性高,如果想增加一个产品的话,只要扩展一个工厂类就可以

3、屏蔽产品的具体实现,调用者只关心产品的接口就可以了

缺点

会提高系统的复杂性,每次增加一个产品的话,都需要增加一个具体类和对象实现工厂,使得整个系统的类的数目成倍的增加,也会增加系统对类的依赖性,这并不是什么好事

UML

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9ma1qtFx-1598771052789)(./image/1.png)]

实现

public interface PhoneProduct {
    /**
     * 生产手机
     */
    public void phone();
}
public class HuaWeiProduct implements PhoneProduct {
    @Override
    public void phone() {
        System.out.println("华为手机!");
    }
}
public class XiaoMiProduct implements PhoneProduct {
    @Override
    public void phone() {
        System.out.println("小米手机!");
    }
}
public interface Factory {
    public PhoneProduct concreteFactory(String className);
}
public class ConcreteFactory implements Factory {
    @Override
    public PhoneProduct concreteFactory(String className) {
        if ("HuaWei".equalsIgnoreCase(className)){
            return new HuaWeiProduct();
        }else if ("xiaomi".equalsIgnoreCase(className)){
            return new XiaoMiProduct();
        }
        return null;
    }
}
public class Client {
    public static void main(String[] args) {
        Factory factory = new ConcreteFactory();
        PhoneProduct huawei = factory.concreteFactory("huawei");
        huawei.phone();
        PhoneProduct xiaomi = factory.concreteFactory("xiaomi");
        xiaomi.phone();
    }
}

抽象工厂模式

简介

抽象工厂模式,它是工厂的工厂,意思就是,它用来创建某个工厂。工厂再创建具体产品

优点

在增加某个产品族下的某类产品的时候是非常方便的,不需要再新增加更多的工厂。

缺点

但是在增加一个新的产品族的话,是非常复杂的,会增加整个系统的复杂性

UML

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TFRw47gd-1598771052792)(./image/2.png)]

实现

public interface PhoneProduct {
    public void phone();
}
public class HuaWeiPhone implements PhoneProduct {
    @Override
    public void phone() {
        System.out.println("华为手机");
    }
}
public class XiaoMiPhone implements PhoneProduct {
    @Override
    public void phone() {
        System.out.println("小米手机");
    }
}
public interface ColorProduct {
    public void fill();
}
public class RedProduct implements ColorProduct {
    @Override
    public void fill() {
        System.out.println("红色");
    }
}
public class BlueProduct implements ColorProduct {
    @Override
    public void fill() {
        System.out.println("蓝色");
    }
}
public abstract class AbstractFactory {
    public abstract ColorProduct getColor(String className);
    public abstract PhoneProduct getPhone(String className);
}
public class ColorFactory extends AbstractFactory {
    @Override
    public ColorProduct getColor(String className) {
        if ("red".equalsIgnoreCase(className)){
            return new RedProduct();
        }else if ("blue".equalsIgnoreCase(className)){
            return new BlueProduct();
        }
        return null;
    }

    @Override
    public PhoneProduct getPhone(String className) {
        return null;
    }
}
public class PhoneFactory extends AbstractFactory{
    @Override
    public ColorProduct getColor(String className) {
        return null;
    }

    @Override
    public PhoneProduct getPhone(String className) {
        if ("HuaWei".equalsIgnoreCase(className)){
            return new HuaWeiPhone();
        }else if ("xiaomi".equalsIgnoreCase(className)){
            return new XiaoMiPhone();
        }
        return null;
    }
}
public class FactoryProducer {
    public static AbstractFactory getFactory(String factoryName){
        if ("phone".equalsIgnoreCase(factoryName)){
            return new PhoneFactory();
        }else if ("color".equalsIgnoreCase(factoryName)){
            return new ColorFactory();
        }
        return null;
    }
}
public class Client {
    public static void main(String[] args) {
        AbstractFactory phoneFactory = FactoryProducer.getFactory("phone");
        PhoneProduct xiaomi = phoneFactory.getPhone("xiaomi");
        xiaomi.phone();
        PhoneProduct huawei = phoneFactory.getPhone("huawei");
        huawei.phone();
        AbstractFactory colorFactory = FactoryProducer.getFactory("color");
        ColorProduct red = colorFactory.getColor("red");
        red.fill();
        ColorProduct blue = colorFactory.getColor("blue");
        blue.fill();
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值