project方法模式
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
我的理解:工厂方法模式不是通过newkeyword来创建对象的。而是通过工厂接口提供的方法来创建其它对象。
工厂设计模式,在开发过程中非经常见,以下使用一个样例来引入普遍的工厂设计模式。
一个加工厂商加工不同的产品。
Product类。抽象类,表示不同的产品。
FoodProduct类,继承Product类,并实现其抽象方法。
FruitProduct类,继承Product类。并实现其抽象方法。
Creator类,是一个抽象工厂类,提供加工的方法。
NumberOneCreator类,表示一号工厂,实现其Creator类,用于加工不同的产品类。
public class FactoryTest {
public static void main(String[] args) {
//通过创建子类对象,将接口实例化。
Creator cFactory = new NumberOneCreator();
//通过子类的方法。创建一个须要的对象。
FoodProduct food = cFactory.createProduce(FoodProduct.class);
food.mothod1();
food.mothod2();
}
}
//定义一个抽象的产品方法。
abstract class Product{
public void mothod1(){
System.out.println("方法一,加工的都是使用的产品...");
}
public abstract void mothod2();
}
class FruitProduct extends Product{
@Override
public void mothod2() {
System.out.println("方法二。生产出来了果汁....");
}
}
class FoodProduct extends Product{
@Override
public void mothod2() {
System.out.println("方法二,生产出来了零食....");
}
}
abstract class Creator{
public abstract <T extends Product> T createProduce(Class<T> t);
}
class NumberOneCreator extends Creator{
/**
* 传入的參数,是Product类的子类。
*/
@Override
public <T extends Product> T createProduce(Class<T> t) {
Product p = null;
try {
//Class类创建一个 工厂类实例
p = (Product) Class.forName(t.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) p;
}
}
工厂模式的长处:1、具有良好的封装性。代码结构清晰。
减少模块间的耦合性
2、工厂方法模式的扩展性很优秀。
3、屏蔽产品类,产品类对外提供的是一个接口。仅仅要 接口不改变系统中的上层模块就不会发生改变。
工厂模式的扩展:
1、缩小为简单的工厂模式(静态工厂模式)
一个模块仅须要一个工厂类,没有必要把它产生出来。使用静态的方法就能够了。
---该模式称为简单工厂模式(又称静态工厂模式)。
调用者使用十分方便。开发中也经经常使用到,可是扩展不好。
UML类图
public class NvWatest {
public static void main(String[] args) {
YellowMan yellowMan = HumanFactory.CreatHuman(YellowMan.class);
yellowMan.skin();
yellowMan.talk();
}
}
interface Human{
//人类的语言
void talk();
//人类的肤色
void skin();
}
class BlackMan implements Human{
@Override
public void talk() {
System.out.println("我是黑种人,我说的是非洲语...");
}
@Override
public void skin() {
System.out.println("我是黑种人。我的皮肤是黑色的...");
}
}
class WhiteMan implements Human{
@Override
public void talk() {
System.out.println("我是白种人,我说的是英语...");
}
@Override
public void skin() {
System.out.println("我是白种人,我的皮肤是白色的...");
}
}
class YellowMan implements Human{
@Override
public void talk() {
System.out.println("我是黄种人,我说的是汉语...");
}
@Override
public void skin() {
System.out.println("我是黄种人,我的皮肤是黄色的...");
}
}
class HumanFactory{
public static <T extends Human> T CreatHuman(Class<T> c){
Human man = null;
try {
man = (Human) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) man;
}
}
2、升级为多个设计模式
将工厂类划分为YellowFactory,BlackFactory,WhiteFactory三类。都继承自抽象工厂。
这三中工厂分成实现创造不同的人类。
UML图
public class NvWatest {
public static void main(String[] args) {
YellowMan yellowMan = (YellowMan) new YellowHumanFactory().CreatHuman();
yellowMan.skin();
yellowMan.talk();
}
}
interface Human{
//人类的语言
void talk();
//人类的肤色
void skin();
}
class BlackMan implements Human{
@Override
public void talk() {
System.out.println("我是黑种人,我说的是非洲语...");
}
@Override
public void skin() {
System.out.println("我是黑种人,我的皮肤是黑色的...");
}
}
class WhiteMan implements Human{
@Override
public void talk() {
System.out.println("我是白种人,我说的是英语...");
}
@Override
public void skin() {
System.out.println("我是白种人。我的皮肤是白色的...");
}
}
class YellowMan implements Human{
@Override
public void talk() {
System.out.println("我是黄种人,我说的是汉语...");
}
@Override
public void skin() {
System.out.println("我是黄种人,我的皮肤是黄色的...");
}
}
abstract class AbstractHumanFactory{
public abstract Human CreatHuman();
}
class BlackHumanFactory extends AbstractHumanFactory{
@Override
public Human CreatHuman() {
// TODO Auto-generated method stub
return new BlackMan();
}
}
class YellowHumanFactory extends AbstractHumanFactory{
@Override
public Human CreatHuman() {
// TODO Auto-generated method stub
return new YellowMan();
}
}
class WhiteHumanFactory extends AbstractHumanFactory{
@Override
public Human CreatHuman() {
// TODO Auto-generated method stub
return new WhiteMan();
}
}
下面两种临时不懂得利用的价值,可是还是先了解一下为好
3、替代单例模式
创建一个单例工厂,来创建须要创建的类。并保证仅仅有一个实例对象。
public class SingletonTest {
public static void main(String[] args) {
Singleton s = new SingtonFactory().getSingle();
s.mothod1();
}
}
class SingtonFactory{
private static Singleton single;
static{
try {
Class c = Class.forName(Singleton.class.getName());
//获得无參构造
Constructor<Singleton> constractor = c.getDeclaredConstructor();
//设置无參构造是可訪问的
constractor.setAccessible(true);
//产生一个实例对象
single = constractor.newInstance();
} catch (Exception e) {
System.out.println("创建实例失败...");
}
}
public Singleton getSingle(){
return single;
}
}
class Singleton{
//不让外界调用者创建实例
private Singleton(){
}
public void mothod1(){
System.out.println("sington的一个方法....");
}
}4、延迟初始化
一个对象被消费完成后,并不立马释放,工厂类保持其初始状态,等待再次被使用。
public class FactoryTest {
public static void main(String[] args) {
for(int i=0;i<5;i++){
Product p = new Creator().createProduce("food");
p.mothod1();
p.mothod2();
System.out.println("------------------------------");
}
}
}
//定义一个抽象的产品方法。
abstract class Product{
public void mothod1(){
System.out.println("方法一,加工的都是使用的产品...");
}
public abstract void mothod2();
}
class FruitProduct extends Product{
@Override
public void mothod2() {
System.out.println("方法二,生产出来了果汁....");
}
}
class FoodProduct extends Product{
@Override
public void mothod2() {
System.out.println("方法二,生产出来了零食....");
}
}
class Creator {
private static Map<String,Product> map = new HashMap<String, Product>();
public static synchronized Product createProduce(String type) {
Product p = null;
//首先推断map集合中是否存在该对象
if(map.containsKey(type)){
System.out.println("-----------存在该对象-------------");
p = map.get(type);
}else{
//假设不存在,就依据类型来创建不同的实例
if(type.equals("food")){
p = new FoodProduct();
}else{
p = new FruitProduct();
}
}
map.put(type, p);
return p;
}
}