大家好,我是Morning,在CSDN写文,分享一些Java基础知识,一些自己认为在学习过程中比较重要的东西,致力于帮助初学者入门,希望可以帮助你进步。感兴趣的欢迎关注博主,和博主一起学习Java知识。大家还可以去专栏查看之前的文章,希望未来能和大家共同探讨技术。
工厂模式
思想就是为了创建者和调用者分离。
满足开闭原则,依赖倒置原则,迪米特法则
在实例化对象的时候不使用new,就是将实现类,创建对象统一管理和控制,将调用者跟我们实现类解耦。
静态工厂模式
定义一个接口:
public interface Person {
void name();
}
定义实现类:
public class Student implements Person{
@Override
public void name() {
System.out.println("我是学生!");
}
}
public class Teacher implements Person{
@Override
public void name() {
System.out.println("我是老师!");
}
}
创建工厂类:
public class MyFactory {
public static Person getPerson(String person) {
if (person.equals("学生")) {
return new Student();
} else if (person.equals("老师")) {
return new Teacher();
} else {
return null;
}
}
}
当我们需要哪个实现类的时候调用工厂中的方法,传入具体的参数,就可以得到想要的实例对象。
这样的工厂模式有一个缺点,那就是,当你需要创建其他的实现类时,就要修改工厂类,这不符合开闭原则。也就是说当你添加一个产品时就必须修改代码。根据实际业务来说,静态工厂模式比较友好。
工厂方法模式
与静态工厂模式不同的是,我们创建一个工厂接口,使得每个产品有属于自己的工厂,然后这个工厂实现这个工厂接口。
这样的话,添加新产品时就不需要修改原来有的代码,只需要为新的产品添加一个新的工厂就可以。但是这样带来的问题就是,代码量增加。工厂方法模式更符合设计原则。
抽象工厂模式
围绕一个超级工厂创建其他的工厂,超级工厂就是其他工厂的工厂。也就是给工厂创建了工厂。
首先来了解俩个概念:
-
产品等级:说白了就是同一种类型的产品叫做同一个产品等级,就像各种牌子的手机都是属于同一产品等级。
-
产品族:说白了就可以理解为同一个牌子,小米旗下的手机,手表,电脑,属于同一产品族。
代码实现:
首先创建俩种产品(俩个产品等级)的接口:
//手机产品接口
public interface PhoneProduct {
void run(); //开机
void down(); //关机
}
//手表产品接口
public interface WatchProduct {
void setting(); //设置时间
void lookTime(); //查看时间
}
然后创建俩类产品的实现类:
//华为手机
public class HuaweiPhone implements PhoneProduct{
@Override
public void run() {
System.out.println("huawei开机");
}
@Override
public void down() {
System.out.println("huawei关机");
}
}
//oppo手机
public class OppoPhone implements PhoneProduct{
@Override
public void run() {
System.out.println("oppo开机");
}
@Override
public void down() {
System.out.println("oppo关机");
}
}
//华为手表
public class HuaweiWatch implements WatchProduct{
@Override
public void setting() {
System.out.println("设置huawei手表");
}
@Override
public void lookTime() {
System.out.println("用huawei手表查看时间");
}
}
//oppo手表
public class OppoWatch implements WatchProduct{
@Override
public void setting() {
System.out.println("设置oppo手表");
}
@Override
public void lookTime() {
System.out.println("用oppo手表查看时间");
}
}
然后创建一个产品工厂:
//分为俩个产品等级
public interface ProductFactory {
PhoneProduct phoneProduct();
WatchProduct watchProduct();
}
然后创建俩个产品族的工厂:
//华为
public class HuaweiFactory implements ProductFactory{
@Override
public PhoneProduct phoneProduct() {
return new HuaweiPhone();
}
@Override
public WatchProduct watchProduct() {
return new HuaweiWatch();
}
}
//oppo
public class OppoFactory implements ProductFactory{
@Override
public PhoneProduct phoneProduct() {
return new OppoPhone();
}
@Override
public WatchProduct watchProduct() {
return new OppoWatch();
}
}
在使用时,需要用一个产品族的工厂来获得不同产品等级的产品对象。代码如下:
public class test {
public static void main(String[] args) {
//oppo
OppoFactory oppoFactory = new OppoFactory();
PhoneProduct phoneProduct = oppoFactory.phoneProduct();
phoneProduct.run();
phoneProduct.down();
WatchProduct watchProduct = oppoFactory.watchProduct();
watchProduct.setting();
watchProduct.lookTime();
System.out.println("====================");
//华为
HuaweiFactory huaweiFactory = new HuaweiFactory();
phoneProduct = huaweiFactory.phoneProduct();
phoneProduct.run();
phoneProduct.down();
watchProduct = huaweiFactory.watchProduct();
watchProduct.setting();
watchProduct.lookTime();
}
}
在这个案例里面,超级工厂就是ProductFactory接口。
优点:无需关心创建细节,将一个产品族的对象统一到一起创建。
缺点:产品族中扩展新产品困难,增加了抽象性和理解难度。
好了,本次的分享到这里就结束了。感谢您的阅读。博主会在日后给大家分享关于设计模式的其他的知识,和大家一起探讨,有兴趣的可以关注博主。文中有什么不当的地方,欢迎大家在评论区指出,大家一起探讨、学习。🤞🤞🤞