【设计模式】简单工厂模式

面向对象程序设计的优点和思想:

  • 可维护
  • 可扩展
  • 可复用
  • 灵活性好

面向对象程序设计的原则:

  • 通过封装、继承和多态把程序的耦合度降低。类内耦合过紧不利于维护。使用设计模式是的程序更加灵活,容易修改,且易于复用。
  • 用尽可能的方法去避免重复

工厂模式

一、含义特点
工厂模式专门负责将大量有共同接口的类实例化。工厂可以动态的决定将哪一个类实例化,不必事先知道每次要被实例化哪个类。
工厂模式的形态:

  • 简单工厂模式(Simple Factory)
  • 工厂方法模式(Factory Method)
  • 抽象工厂模式(Abstract Factory)

二、简单工厂模式
1.定义
简单工厂模式根据提供的数据,的一个类的实例返回几个可能类中的一个类的实例。通常它返回的类都有一个公共的父类和公共的方法。

  • 工厂类角色Creator:工厂类在客户端的直接控制下(create方法)创建产品对象。
  • 抽象产品角色Product:定义简单工厂闯进的对象的父类或他们共同拥有的接口。可以是一个类、抽象类或接口。
  • 具体产品角色ConcreteProduct:定义工厂具体加工出的对象。

接口:是用来封装隔离具体实现的,目的是不让客户端知道封装体内部的具体实现。简单工厂的位置是位于封装体内的,所以简单工厂知道具体类的实现是没有关系的。
对于客户端来说,只是知道了接口和简单工厂。

2.优缺点
优点:
工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。简单工厂模式通过这种做法实现了对责任的分割。
缺点:

  • 当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变,就是模式的缺点。因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
  • 同时,系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂。
  • 简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。

本质
选择实现

编程是一门技术,更是一门艺术。

3.应用场景

  • 如果想要完全封装隔离具体实现,让外部只能通过接口来操作封装体,则可以选用简单工厂。让客户端通过工厂来获取相应的接口,而无需关心具体的实现。
  • 如果想要把对外创建对象的职责集中管理和控制,可以选用简单工厂。

实例

【问题】实现动物叫声类

【代码】

public interface IShout {
	
	abstract public String shout();

}
public interface IChange {
	
	abstract public String change(String thing);

}
public interface IDoShout {
	
	abstract public String doShout();

}
abstract public class Animals implements IShout, IDoShout {
	
	protected String name = "";
	protected int shoutNum = 3;
	
	public Animals(String name, int shoutNum) {
		super();
		this.name = name;
		this.shoutNum = shoutNum;
	}

	@Override
	public String doShout() {
		String result = "";
		for (int i = 0; i < shoutNum; i++)
			result += shout() + ",";
		return "我的名字叫" + name + " " + result;
	}

	@Override
	public String shout() {
		return "";
	}

}
public class Dog extends Animals {
	public Dog(String name, int shoutNum) {
		super(name, shoutNum);
		// TODO Auto-generated constructor stub
	}

	public String shout() {
		return "汪";
	}
	
	public String doShout() {
		return super.doShout();
	}

}
public class Cat extends Animals {

	public Cat(String name, int shoutNum) {
		super(name, shoutNum);
		// TODO Auto-generated constructor stub
	}

	public String shout() {
		return "喵";
	}
	
	public String doShout() {
		return super.doShout();
	}

}
public class Monkey extends Animals {

	public Monkey(String name, int shoutNum) {
		super(name, shoutNum);
		// TODO Auto-generated constructor stub
	}

	public String shout() {
		return "吱";
	}
	
	public String doShout() {
		return super.doShout();
	}

}
public class Pig extends Animals {
	
	public Pig(String name, int shoutNum) {
		super(name, shoutNum);
		// TODO Auto-generated constructor stub
	}

	public String shout() {
		return "哼";
	}
	
	public String doShout() {
		return super.doShout();
	}

}
public class MachineCat extends Cat implements IChange {

	public MachineCat(String name, int shoutNum) {
		super(name, shoutNum);
		// TODO Auto-generated constructor stub
	}

	@Override
	public String change(String thing) {
		return super.doShout() + " 我有万能的口袋,我可以变出"+thing;
	}

}
public class SunWukong extends Monkey implements IChange {

	public SunWukong(String name, int shoutNum) {
		super(name, shoutNum);
		// TODO Auto-generated constructor stub
	}

	@Override
	public String change(String thing) {
		return super.doShout() + " 我会七十二变,我可以变成"+thing;
	}

}
public class ZhuBajie extends Pig implements IChange {
	
	public ZhuBajie(String name, int shoutNum) {
		super(name, shoutNum);
		// TODO Auto-generated constructor stub
	}

	@Override
	public String change(String thing) {
		return super.doShout() + " 我会三十六变,我可以变成"+thing;
	}

}

【UML图】
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值