软件设计七大原则
一、简单工厂(静态工厂方法)
它存在的目的很简单:定义一个创建对象的接口。
组成:
工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻 辑。在java中它往往由一个具体类实现。
抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。
具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
例子
1.抽象产品角色
package simpleFactory;
public interface car {
void name();
}
2.具体产品角色
package simpleFactory;
public class tesla implements car{
@Override
public void name() {
System.out.println("特斯拉");
}
}
package simpleFactory;
public class wuLing implements car{
@Override
public void name() {
System.out.println("五菱");
}
}
3.工厂类角色
package simpleFactory;
public class carFactory {
public static car getCar(String car){
if (car.equals("wuLing")){
return new wuLing();
}
else if (car.equals("tesla")){
return new tesla();
}
else {
return null;
}
}
}
4.顾客测试类
package simpleFactory;
public class consumer {
public static void main(String[] args) {
car wuLing = carFactory.getCar("wuLing");
car tesla = carFactory.getCar("tesla");
wuLing.name();
tesla.name();
}
}
优缺点
优点
专门定义一个工厂类负责创建其他类的实例,最大的优点在于工厂类
中包含了必要的逻辑,根据客户需要的条件动态实例化相关的类。
优点
当需要增加一种产品时,比如ProductC就需要修改简单工厂类SimpleFactory(增加if-else块),这违背了开闭原则。
二、工厂方法
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。
例子
//创建工厂接口CarFactory:
public interface CarFactory {
Car createCarFactory();
}
//创建具体类型的工厂:
public class BenzFactory implements CarFactory {
@Override
public Car createCarFactory() {
return new BiyadiCar();
}
}
public class BiyadiFactory implements CarFactory{
@Override
public Car createCarFactory() {
return new BiyadiCar();
}
}
public class HongqiFactory implements CarFactory{
@Override
public Car createCarFactory() {
return new HongqiCar();
}
}
//测试
public static void main(String[] args) {
HongqiFactory hongqiFactory = new HongqiFactory();
Car carFactory = hongqiFactory.createCarFactory();
carFactory.createCar();
}
}
//输出:生产比亚迪
结论:用户只需要知道具体工厂的名字,就可以得到想要的产品。
其满足单一原则,开闭原则,但是灵活性较差。
三、抽象工厂
抽象工厂由抽象工厂,具体工厂,抽象产品和具体产品等4个要素构成
抽象工厂各个元素的作用
- 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法
newProduct(),可以创建多个不同等级的产品。 - 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
- 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
- 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。
结构如下: