简单工厂模式
其实并不算是一种设计模式,更多的是一种编程习惯。
定义一个工厂类,根据传入的参数的不同返回不同的实例,被创建的实例具有共同的接口或者父类;因为简单工厂模式中创建实例的方法是静态方法,因此又称为静态工厂模式。
工厂角色
负责实现创建所有具体产品
的内部逻辑,工厂类中提供了静态的
工厂方法,该方法可以根据传入的参数创建不同的具体产品对象,可以直接被外部调用;抽象产品角色
是所创建的所有对象的父类,是所有具体产品
角色的公共代码集合;具体产品角色
是工厂类创建的目标,是抽象产品
的具体,也就是需要创建的具体对象;创建一个水果工厂,水果工厂中可以创建苹果、香蕉等各种各样的水果。
抽象产品类:
public abstract class Fruits {
public abstract void produce();
}
具体产品角色:
public class Apple extends Fruits{
@Override
public void produce() {
System.out.println("生产了一个Apple");
}
}
public class Banana extends Fruits{
@Override
public void produce() {
System.out.println("生产了一个香蕉");
}
}
public class Pear extends Fruits{
@Override
public void produce() {
System.out.println("生产了一个梨");
}
}
工厂类:
// 工厂类提供静态的方法
public class FruitsFactory {
public static Fruits getFruit(String type) throws Exception {
if ("apple".equals(type)) {
return new Apple();
} else if ("pear".equals(type)) {
return new Pear();
} else if ("banana".equals(type)) {
return new Banana();
} else {
System.out.println("输入的苹果类型有误~!");
throw new Exception();
}
}
}
客户端类:
public class Client {
public static void main(String[] args) throws Exception {
Fruits apple = FruitsFactory.getFruit("apple");
Fruits banana = FruitsFactory.getFruit("banana");
Fruits pear = FruitsFactory.getFruit("pear");
apple.produce();
banana.produce();
pear.produce();
}
}
简单工厂
很简单,但是我们发现如果需要添加新的产品时,我们必定会修改工厂类的源代码,违反了开闭原则。所以我们引入了工厂方法模式
,针对不同的对象提供不同的工厂。
定义一个抽象工厂类,工厂类中定义了抽象工厂方法,该方法定义了创建对象的公共接口,具体的创建细节由子类来实现。(将产品的实例化操作延迟到工厂的子类中完成)。
抽象产品
是对产品进行声明;具体产品
是抽象产品的具体实现;抽象工厂
声明一个创建产品的工厂方法,该方法的返回值是产品基类;具体工厂
重写抽象工厂中创建的工厂方法,使其返回不同类型的产品;苹果工厂专门用来创建苹果,香蕉工厂专门用来创建香蕉等,这些工厂都继承自同一个基类。
抽象工厂类:
public abstract class Factory {
public abstract Fruits product();
}
具体工厂:
public class AppleFactory extends Factory{
@Override
public Fruits product() {
return new Apple();
}
}
public class BananaFactory extends Factory{
@Override
public Fruits product() {
return new Banana();
}
}
public class PearFactory extends Factory{
@Override
public Fruits product() {
return new Pear();
}
}
抽象产品:
public abstract class Fruits {
public abstract void show();
}
具体产品:
public class Apple extends Fruits {
@Override
public void show() {
System.out.println("一个甜苹果");
}
}
public class Banana extends Fruits {
@Override
public void show() {
System.out.println("一个大香蕉");
}
}
public class Pear extends Fruits {
@Override
public void show() {
System.out.println("一个红色的桃子");
}
}
客户端(Client)
public class Client {
public static void main(String[] args) {
// 需要生产苹果
Factory appleFactory = new AppleFactory();
Fruits apple = appleFactory.product();
apple.show();
// 需要生产香蕉
Factory bananaFactory = new BananaFactory();
Fruits banana = bananaFactory.product();
banana.show();
// 需要生产桃子
Factory pearFactory = new PearFactory();
Fruits pear = pearFactory.product();
pear.show();
}
}
工厂方法模式
中的每一个工厂都只生产一类产品,当产品过多时,会导致系统重存在大量的工厂类,我们可以将一些拥有相关特性的产品组成一个产品族
,由同一个工厂生产这个产品族,这就是抽象工厂模式
为了更好的理解抽象工厂模式,我们先了解两个概念:
产品的等级结构:产品的等级结构就是产品的继承结构。比如:一个抽象类是电视机,子类有海尔电视机、海信电视机、TCL电视机,抽象类和具体的子类就构成了产品等级机构。 产品族:由同一个工厂产生的不同的产品类型。比如:海尔工厂生产电视机、电冰箱构成了一个产品族。
在抽象工厂中声明多个工厂方法,具体工厂实现了抽象工厂中定义的工厂方法生成具体的产品,这种模式称为抽象工厂模式
。
抽象工厂
声明了一组用于创建一族产品的方法,每个方法对应一个产品;具体工厂
实现了在抽象工厂中定义的方法,用于生成每一个具体的产品;抽象产品
定义每一种产品所具体的公共逻辑;具体产品
定义具体工厂生产的具体产品;北方的人喜欢吃北方产的水果,而南方的人喜欢吃南方产的水果,所以工厂就在北方建了一个工厂,负责生产北方的水果,在南方也建了一个工厂,负责生产南方的水果
抽象工厂类:
public abstract class FruitFactory {
public abstract Apple productApple();
public abstract Banana productBanana();
public abstract Orange productOrange();
}
具体工厂类:
public class NorthFruitFactory extends FruitFactory{
@Override
public Apple productApple() {
return new NorthApple();
}
@Override
public Banana productBanana() {
return new NorthBanana();
}
@Override
public Orange productOrange() {
return new NorthOrange();
}
}
public class SouthFruitFactory extends FruitFactory{
@Override
public Apple productApple() {
return new SouthApple();
}
@Override
public Banana productBanana() {
return new SouthBanana();
}
@Override
public Orange productOrange() {
return new SouthOrange();
}
}
抽象产品类:
public abstract class Apple {
public abstract void get();
}
public abstract class Banana {
public abstract void get();
}
public abstract class Orange {
public abstract void get();
}
具体产品类:
public class NorthApple extends Apple{
@Override
public void get() {
System.out.println("得到一个北方苹果");
}
}
public class NorthBanana extends Banana{
@Override
public void get() {
System.out.println("得到一个北方香蕉");
}
}
public class NorthOrange extends Orange {
@Override
public void get() {
System.out.println("得到一个北方橘子");
}
}
public class SouthApple extends Apple{
@Override
public void get() {
System.out.println("得到一个南方苹果");
}
}
public class SouthBanana extends Banana{
@Override
public void get() {
System.out.println("得到一个南方香蕉");
}
}
public class SouthOrange extends Orange {
@Override
public void get() {
System.out.println("得到一个南方橘子");
}
}
客户端:
public class Client {
public static void main(String[] args) {
FruitFactory northFruitFactory = new NorthFruitFactory();
Apple northApple = northFruitFactory.productApple();
northApple.get();
Banana northBanana = northFruitFactory.productBanana();
northBanana.get();
Orange northOrange = northFruitFactory.productOrange();
northOrange.get();
FruitFactory southFruitFactory = new SouthFruitFactory();
Apple southApple = southFruitFactory.productApple();
southApple.get();
Banana southBanana = southFruitFactory.productBanana();
southBanana.get();
Orange southOrange = southFruitFactory.productOrange();
southOrange.get();
}
}
欢迎朋友们关注我的公众号📢📢📢:【码匠er】
我会持续更新关于技术的文章❤️🤎💚🧡💛
欢迎大家点赞👍 收藏 ⭐ 关注 💡三连支持一下~~~
查看文章过程中有问题或者有需要修改的地方,欢迎私聊我哦 🗨🗨🗨
不管世界变成什么样,我们都要加强自己自身能力~✊✊✊
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。