参考:https://www.zhihu.com/question/20367734
定义
任何可以产生对象的方法或者类,都可以吃称之为工厂
单例也是一种工厂,灵活控制生产过程,权限,修饰,日志
专门生产对象,把对象的实例化和初始化都封装起来
只需要获取相关对象实例,而不关心实际的生产过程
应用场景
1.任意定制交通工具
2.任意定制生产过程
3.任意定制产品一族
简单工厂
常用于具体的工具很少扩展的情况下,因为内部实现简单,直接可以使用,如果需要扩展,则需要修改内部实现,就违反了开闭原则
优点:简单粗暴,工厂类中实现了返回相关实例
缺点:难以扩展
代码块
定义两个类
public class Car{
public void go() {
System.out.println("car go .......");
}
}
public class Broom {
public void go() {
System.out.println("bromm go ....");
}
}
工厂方法调用
public class SimpleFactory {
public Car createCar() {
//before processing
return new Car();
}
public Broom createBroom() {
return new Broom();
}
}
以上是简单工厂的代码
工厂方法
优点
1.扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
2.屏蔽产品的具体实现,调用者只关心产品的接口。
缺点
1.每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖
代码块
定义接口
public interface IFactory {
void CreateOption();
}
public interface IProduct {
void add();
}
定义两个实现类
public class One implements IFactory {
@Override
public IProduct CreateOption() {
return new OneProduct();
}
}
public class OneProduct implements IProduct {
@Override
public void add() {
System.out.println("this is one product");
}
}
具体调用实现
public class Main {
public static void main(String[] args) {
IFactory one = new One();
one.CreateOption().add();
}
}
以上是工厂方法的实现代码
抽象工厂
定义多个抽象工厂产品类,统一由抽象工厂A管理,拥有不同的产品族
工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,我们可以将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产,这就是抽象工厂
优点
1.抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易,所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。
2.当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。
3.增加新的产品族很方便,无须修改已有系统,符合“开闭原则”。
缺点
增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了“开闭原则”
代码块
定义一个抽象工厂
public abstract class AbstractFactory {
abstract Food createFood();
abstract Vehicle createVehicle();
}
定义两个实现
public class MagicFactory extends AbstractFactory {
@Override
Food createFood() {
return new Bread();
}
@Override
Vehicle createVehicle() {
return new Broom();
}
}
public class ModernFactory extends AbstractFactory {
@Override
Food createFood() {
return new Bread();
}
@Override
Vehicle createVehicle() {
return new Car();
}
}
定义具体的产品抽象类
public abstract class Vehicle {
abstract void go();
}
public abstract class Food {
abstract void printName();
}
定义具体实现产品类的方法
public class Car extends Vehicle {
public void go() {
System.out.println("car go .......");
}
}
public class Broom extends Vehicle {
public void go() {
System.out.println("bromm go ....");
}
}
public class Bread extends Food{
public void printName() {
System.out.println("is print name now");
}
}
具体调用
public class Main {
public static void main(String[] args) {
AbstractFactory f = new ModernFactory();
Vehicle c = f.createVehicle();
c.go();
Food b = f.createFood();
b.printName();
}
}
一些知识点
抽象工厂是类,工厂方法是方法
工厂方法一个工厂只能生产一种产品。抽象工厂一个工厂可以生产一类产品
本文详细介绍了设计模式中的工厂模式,包括定义、应用场景、简单工厂、工厂方法和抽象工厂。简单工厂适用于对象不频繁扩展的情况,而工厂方法和抽象工厂则提供更高的扩展性和灵活性,分别适用于产品族的单一生产和多个产品族的生产。抽象工厂模式虽然增加新的产品等级结构较为复杂,但能确保同一产品族的对象一起工作。
184

被折叠的 条评论
为什么被折叠?



